피봇 테이블(pivot table)이란 데이터 열(column) 중에서 두 개를 키(key)로 사용하여 데이터를 선택하는 방법을 말한다.
피봇 테이블을 사용하기 위해서는 키가 될 수 있는 두 개의 열(column) 혹은 필드(field)를 선택하여 이 두 열을
로 변경해야 한다.
pivot 메서드를 사용하면 행 인덱스, 열 인덱스, 자료가 될 3가지의 열(column)을 지정할 수 있다.
In [1]:
data = {
'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 2.5, 3.0, 2.5, 3.5]
}
df = pd.DataFrame(data, columns=["state", "year", "pop"])
df
Out[1]:
In [2]:
df.pivot("state", "year", "pop")
Out[2]:
In [5]:
df.pivot("year", "pop", "state")
In [4]:
df.set_index(["state", "year"])
Out[4]:
In [5]:
df.set_index(["state", "year"]).unstack()
Out[5]:
그룹 연산은 피봇 테이블과 달리 키에 의해서 결정되는 데이터가 복수개가 있어도 괜찮다. 대신 연산을 통해 복수개의 그룹 데이터에 대한 대표값을 정한다. 이를 split-apply-combine 연산이라고도 한다.
apply 단계
count(), mean(), median(), min(), max()sum(), prod(), std(), var(), quantile()first(), last()combine 단계
In [6]:
np.random.seed(0)
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],
'key2': ['one', 'two', 'one', 'two', 'one'],
'data1': np.random.randn(5),
'data2': np.random.randn(5)})
df
Out[6]:
In [7]:
df.data1.groupby(df.key1).mean()
Out[7]:
In [8]:
gs = df.data1.groupby(df.key1)
gs
Out[8]:
In [9]:
print("="*50)
for n, g in gs:
print("[key]:", n)
print("[group]:", type(g))
print("-"*50)
print(g)
print("-"*50)
print("[mean]:", g.mean())
print("="*50)
In [10]:
gs.mean()
Out[10]:
In [11]:
means = df.data1.groupby([df.key1, df.key2]).mean()
means
Out[11]:
In [10]:
means = df.data1.groupby([df.key1, df.key2]).mean()
means
Out[10]:
In [15]:
np.random.seed(0)
people = pd.DataFrame(np.random.randn(5,5),
columns=['a','b','c','d','e'],
index=['Joe','Steve','Wes','Jim','Travis'])
people.ix[2:3, ['b', 'c']] = np.nan
people
Out[15]:
In [16]:
print("="*80)
for n, g in people.groupby(people.index):
print("[key]:", n)
print("[group]:", type(g))
print("-"*80)
print(g)
print("="*80)
In [17]:
mapping = {'Joe': 'J', 'Jim': 'J', 'Steve': 'S', 'Wes': 'S', 'Travis': 'S'}
print("="*80)
for n, g in people.groupby(mapping):
print("[key]:", n)
print("[group]:", type(g))
print("-"*80)
print(g)
print("="*80)
In [18]:
cap1 = lambda x: x[0].upper()
print("="*80)
for n, g in people.groupby(cap1):
print("[key]:", n)
print("[group]:", type(g))
print("-"*80)
print(g)
print("="*80)
In [21]:
print("="*80)
for n, g in people.groupby(people.columns, axis=1):
print("[key]:", n)
print("[group]:", type(g))
print("-"*80)
print(g)
print("="*80)
In [22]:
mapping = {'a': 'red', 'b': 'red', 'c': 'blue', 'd': 'blue', 'e': 'red', 'f' : 'orange'}
for n, g in people.groupby(mapping, axis=1):
print("[key]:", n)
print("[group]:", type(g))
print("-"*80)
print(g)
print("="*80)
In [23]:
%cd /home/dockeruser/data/pydata-book-master
In [27]:
tips = pd.read_csv('../../pydata-book-master/ch08/tips.csv')
In [28]:
tips.head()
Out[28]:
In [32]:
tips['tip_pct'] = tips['tip'] / tips['total_bill']
tips.tail()
Out[32]:
In [33]:
tips.describe()
Out[33]:
In [34]:
tips.groupby(["sex", "smoker"])[["tip", "tip_pct"]].describe()
Out[34]:
In [35]:
gs = tips.groupby(["sex", "smoker"])
gs_pct = gs["tip_pct"]
In [36]:
gs_pct.mean()
Out[36]:
In [37]:
gs_pct.agg('mean')
Out[37]:
In [38]:
def peak_to_peak(arr):
return arr.max() - arr.min()
gs_pct.agg(['mean', 'std', peak_to_peak])
Out[38]:
In [39]:
gs.agg({'tip_pct': 'mean', 'total_bill': peak_to_peak})
Out[39]:
In [40]:
gs.agg("mean")
Out[40]:
In [41]:
tips2 = tips.copy()
tips2["tips"] = gs.transform("mean")["tip_pct"]
tips2.tail(15)
Out[41]:
In [42]:
def top(df, n=5, column='tip_pct'):
return df.sort_values(by=column)[-n:]
In [43]:
top(tips, n=6)
Out[43]:
In [44]:
tips.groupby('smoker').apply(top)
Out[44]:
In [45]:
tips.groupby(['smoker', 'day']).apply(top, n=1, column='total_bill')
Out[45]:
In [46]:
f = lambda x: x.describe()
tips.groupby(['smoker']).apply(f)
Out[46]:
In [47]:
tips.pivot_table(index=['sex', 'smoker'])
Out[47]:
In [48]:
tips.pivot_table(['tip_pct', 'size'], index=['sex', 'day'], columns='smoker')
Out[48]:
In [49]:
tips.pivot_table(['tip_pct', 'size'], index=['sex', 'day'],
columns='smoker', margins=True)
Out[49]:
In [50]:
tips.pivot_table('tip_pct', index=['sex', 'smoker'], columns='day',
aggfunc=len, margins=True)
Out[50]:
In [51]:
tips.pivot_table('size', index=['time', 'sex', 'smoker'],
columns='day', aggfunc='sum', fill_value=0)
Out[51]: