与多个索引列或索引一起使用groupby时

时间:2019-01-23 01:43:50

标签: python pandas

我有一个如下数据框:

idx=pd.MultiIndex.from_arrays([[1,1,1,2],[1,1,2,2]])
df=pd.DataFrame(columns=idx,index=[1,2,3]).fillna(1)

现在我想在两级列上求和,首先想到的是groupbysum

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调用?

1 个答案:

答案 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(自定义函数)的每个系列的名称都是索引,但是只有单个列被传递。并非所有列。