熊猫:groupby对列的子集求和

时间:2018-11-22 15:39:37

标签: python pandas

我有一个多列的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]

3 个答案:

答案 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)

reindexMultiIndex结合使用只是一种有趣的方式

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