gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:36 26 4
gpt4 key购买 nike

我有一个如下所示的数据框:

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],但这里显示有线输出,它将多个索引转换为元组 (这是有道理的,因为多个索引是元组列表的另一种布局)

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 将多索引更改为 tuple ,它是否也应该更改 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 的每个系列的名称是索引,但只有一列被传递。并非所有列。

关于python - 将 groupby 与多个索引列或索引一起使用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54318915/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com