鉴于以下代码。
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
我想创建一个数据透视表,如下所示:
| 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')
我不确定我是否了解多级cols的工作原理。
答案 0 :(得分:2)
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
现在很容易看到我们只想选择平均列。可以使用loc
:
In [54]: aggd.unstack(['odd1']).loc[:, ('odd2','average')]
Out[54]:
odd1 1 2
clients
A 6.5 8
B 9.0 10