我有一个如下数据框:
idx=pd.MultiIndex.from_arrays([[1,1,1,2],[1,1,2,2]])
df=pd.DataFrame(columns=idx,index=[1,2,3]).fillna(1)
现在我想在两级列上求和,首先想到的是groupby
和sum
df.sum(level=[0,1],axis=1)
1 2
1 2 2
1 2 1 1
2 2 1 1
3 2 1 1
df.groupby(level=[0, 1], axis=1).sum() #same output as above
df.groupby(df.columns.labels, axis=1).sum()#same output as above
由于我们groupby
的所有列,为减少手动输入工作,我尝试使用df.columns
代替level=[0,1]
,但这里向我展示了有线输出,该输出已转换元组的多重索引(这很有意义,因为多重索引是tulple列表的另一种布局)
df.groupby(df.columns,axis=1).sum()
(1, 1) (1, 2) (2, 2)
1 2 1 1
2 2 1 1
3 2 1 1
此外,当我不执行诸如transform之类的聚合函数时,输出将恢复正常
df.groupby(df.columns,axis=1).transform('sum')
1 2
1 1 2 2
1 2 2 1 1
2 2 2 1 1
3 2 2 1 1
问:为什么会这样。如果groupby
将多重索引更改为元组,它是否也应该更改transform
调用?
答案 0 :(得分:1)
我认为这与transform
有关,已编码为可用于数据框的列。即使您按行分组,transform仍只会将列传递给函数。
def f(x):
print(x)
df.groupby(df.columns,axis=1).transform(f)
输出:
1 1 1
1 1
Name: 1, dtype: int64
1 1 1
1 1
Name: 2, dtype: int64
1 1 1
1 1
Name: 3, dtype: int64
1
1 1
1 1 1
2 1 1
3 1 1
1 2 1
Name: 1, dtype: int64
1 2 1
Name: 2, dtype: int64
1 2 1
Name: 3, dtype: int64
2 2 1
Name: 1, dtype: int64
2 2 1
Name: 2, dtype: int64
2 2 1
Name: 3, dtype: int64
传递给f(自定义函数)的每个系列的名称都是索引,但是只有单个列被传递。并非所有列。