我有一个多列的pandas数据框。我想计算此列的各个子集的总和,并为每组列分配一个名称。
是否可以使用groupby或其他熊猫方法来实现?
设置:
import numpy as np; np.random.seed(1)
import pandas as pd
df = pd.DataFrame(np.random.randint(0, 10, (3, 5)), columns=['A', 'B', 'C', 'D', 'E'])
columns_groups = {'First': ['A', 'B', 'C'],
'Second': ['D', 'E'],
'Some': ['A', 'C', 'D'],
'All': ['A', 'B', 'C', 'D', 'E']}
所需的输出:(是否有更好的解决方案?)
out = {}
for name, group in columns_groups.items():
out[name] = df[group].sum(axis=1)
out = pd.DataFrame(out)
out
Out[22]:
All First Second Some
0 27 22 5 19
1 23 8 15 13
2 17 11 6 9
我的尝试
df.groupby(columns_groups, axis=1).sum(axis=1)
Out[21]:
Empty DataFrame
Columns: []
Index: [0, 1, 2]
答案 0 :(得分:1)
您可以吗?
pd.DataFrame({k: df[v].sum(axis=1) for k, v in columns_groups.items()})
All First Second Some
0 27 22 5 19
1 23 8 15 13
2 17 11 6 9
与您所做的相同,只是理解上。
答案 1 :(得分:1)
将reindex
与MultiIndex
结合使用只是一种有趣的方式
df=df.reindex(columns=sum(columns_groups.values(),[]))
t=[(x,z ) for x , y in columns_groups.items() for z in y]
df.columns=pd.MultiIndex.from_tuples(t)
df.sum(level=0,axis=1)
First Second Some All
0 22 8 18 30
1 17 9 16 26
2 6 15 14 21
答案 2 :(得分:1)
您实际上可以通过单行熊猫操作来完成。内存效率更高,超级简单
file['sum']=file.sum(axis=1, skipna = True)
下面的输出
All First Second sum
0 27 22 5 54.0
1 23 8 15 46.0
2 17 11 6 34.0