Pivot table 多级列
Pivot table with multilevel columns
给出下面的代码。
import numpy as np
import pandas as pd
df = pd.DataFrame({
'clients': pd.Series(['A', 'A', 'A', 'B', 'B']),
'odd1': pd.Series([1, 1, 2, 1, 2]),
'odd2': pd.Series([6, 7, 8, 9, 10])})
grpd = df.groupby(['clients', 'odd1']).agg({
'odd2': [np.sum, np.average]
}).reset_index('clients').reset_index('odd1')
>> grpd
odd1 clients odd2
sum average
0 1 A 13 6.5
1 2 A 8 8.0
2 1 B 9 9.0
3 2 B 10 10.0
我想创建一个枢轴 table 如下:
| odd1 | odd1 | ...... | odd1 |
------------------------------------|---------|
clients| average | average | ..... | average |
期望的输出是:
clients | 1 2
--------|------------------
A | 6.5 8.0
B | 9.0 10.0
如果我们的列不是多级的,这将有效:
grpd.pivot(index='clients', columns='odd1', values='odd2')
不确定我是否了解多级列的工作原理。
import numpy as np
import pandas as pd
df = pd.DataFrame({
'clients': pd.Series(['A', 'A', 'A', 'B', 'B']),
'odd1': pd.Series([1, 1, 2, 1, 2]),
'odd2': pd.Series([6, 7, 8, 9, 10])})
aggd = df.groupby(['clients', 'odd1']).agg({
'odd2': [np.sum, np.average]})
print(aggd.unstack(['odd1']).loc[:, ('odd2','average')])
产量
odd1 1 2
clients
A 6.5 8
B 9.0 10
解释:grpd
中的中间步骤之一是
aggd = df.groupby(['clients', 'odd1']).agg({
'odd2': [np.sum, np.average]})
看起来像这样:
In [52]: aggd
Out[52]:
odd2
sum average
clients odd1
A 1 13 6.5
2 8 8.0
B 1 9 9.0
2 10 10.0
aggd
与期望结果
之间的视觉比较
odd1 1 2
clients
A 6.5 8
B 9.0 10
说明odd1
索引需要变成列索引。该操作——将索引标签移动到列标签——是 the unstack
method 完成的工作。所以很自然地解压 aggd
:
In [53]: aggd.unstack(['odd1'])
Out[53]:
odd2
sum average
odd1 1 2 1 2
clients
A 13 8 6.5 8
B 9 10 9.0 10
现在很容易看出我们只想 select 平均列。这可以用 loc
:
来完成
In [54]: aggd.unstack(['odd1']).loc[:, ('odd2','average')]
Out[54]:
odd1 1 2
clients
A 6.5 8
B 9.0 10
给出下面的代码。
import numpy as np
import pandas as pd
df = pd.DataFrame({
'clients': pd.Series(['A', 'A', 'A', 'B', 'B']),
'odd1': pd.Series([1, 1, 2, 1, 2]),
'odd2': pd.Series([6, 7, 8, 9, 10])})
grpd = df.groupby(['clients', 'odd1']).agg({
'odd2': [np.sum, np.average]
}).reset_index('clients').reset_index('odd1')
>> grpd
odd1 clients odd2
sum average
0 1 A 13 6.5
1 2 A 8 8.0
2 1 B 9 9.0
3 2 B 10 10.0
我想创建一个枢轴 table 如下:
| odd1 | odd1 | ...... | odd1 |
------------------------------------|---------|
clients| average | average | ..... | average |
期望的输出是:
clients | 1 2
--------|------------------
A | 6.5 8.0
B | 9.0 10.0
如果我们的列不是多级的,这将有效:
grpd.pivot(index='clients', columns='odd1', values='odd2')
不确定我是否了解多级列的工作原理。
import numpy as np
import pandas as pd
df = pd.DataFrame({
'clients': pd.Series(['A', 'A', 'A', 'B', 'B']),
'odd1': pd.Series([1, 1, 2, 1, 2]),
'odd2': pd.Series([6, 7, 8, 9, 10])})
aggd = df.groupby(['clients', 'odd1']).agg({
'odd2': [np.sum, np.average]})
print(aggd.unstack(['odd1']).loc[:, ('odd2','average')])
产量
odd1 1 2
clients
A 6.5 8
B 9.0 10
解释:grpd
中的中间步骤之一是
aggd = df.groupby(['clients', 'odd1']).agg({
'odd2': [np.sum, np.average]})
看起来像这样:
In [52]: aggd
Out[52]:
odd2
sum average
clients odd1
A 1 13 6.5
2 8 8.0
B 1 9 9.0
2 10 10.0
aggd
与期望结果
odd1 1 2
clients
A 6.5 8
B 9.0 10
说明odd1
索引需要变成列索引。该操作——将索引标签移动到列标签——是 the unstack
method 完成的工作。所以很自然地解压 aggd
:
In [53]: aggd.unstack(['odd1'])
Out[53]:
odd2
sum average
odd1 1 2 1 2
clients
A 13 8 6.5 8
B 9 10 9.0 10
现在很容易看出我们只想 select 平均列。这可以用 loc
:
In [54]: aggd.unstack(['odd1']).loc[:, ('odd2','average')]
Out[54]:
odd1 1 2
clients
A 6.5 8
B 9.0 10