如何跨大熊猫的各个列进行汇总?

时间:2018-10-17 18:09:57

标签: pandas aggregation

有5个成员为每个[E,M,S]贡献事物的价值,如下所示:

E,M,S,Mem1,Mem2,Mem3,Mem4,Mem5
1,365,-10,15,21,18,16,,
1,365,10,23,34,,45,65
365,365,-20,34,45,43,32,23
365,365,20,56,45,,32,38
730,365,-5,82,64,13,63,27
730,365,15,24,68,,79,78

请注意,缺少捐款。我想知道每个[E,M,S]的贡献数量。为此例如输出为:

1,365,-10,4
1,365,10,4
365,365,-20,5
365,365,20,4
730,365,-5,5
730,365,15,4

groupingBy ['E','M','S']然后进行汇总(计数)或应用(函数)但跨轴= 1即可。这是怎么做的?还是任何其他惯用的方式?

1 个答案:

答案 0 :(得分:0)

@Wen发布的答案非常出色,而且绝对是最简单的方法。

如果您想要另一种方法来执行此操作,则可以使用.melt来查看DF中的组。然后,在融化的DF的每个组中使用groupby.sum()聚合。汇总时,您只需要忽略NaN,而一种方法是遵循此SO post-.notnull()中应用于组的方法。

输入DF

print df
     E    M   S  Mem1  Mem2  Mem3  Mem4  Mem5
0    1  365 -10    15    21  18.0    16   NaN
1    1  365  10    23    34   NaN    45  65.0
2  365  365 -20    34    45  43.0    32  23.0
3  365  365  20    56    45   NaN    32  38.0
4  730  365  -5    82    64  13.0    63  27.0
5  730  365  15    24    68   NaN    79  78.0

这是方法

# Apply melt to view groups
dfm = pd.melt(df, id_vars=['E','M','S'])
print(dfm.head(10))
     E    M   S variable  value
0    1  365 -10     Mem1   15.0
1    1  365  10     Mem1   23.0
2  365  365 -20     Mem1   34.0
3  365  365  20     Mem1   56.0
4  730  365  -5     Mem1   82.0
5  730  365  15     Mem1   24.0
6    1  365 -10     Mem2   21.0
7    1  365  10     Mem2   34.0
8  365  365 -20     Mem2   45.0
9  365  365  20     Mem2   45.0

# GROUP BY
grouped = dfm.groupby(['E','M','S'])

# Aggregate within each group, while ignoring NaNs
gtotals = grouped['value'].apply(lambda x: x.notnull().sum())

# (Optional) Reset grouped DF index
gtotals = gtotals.reset_index(drop=False)
print(gtotals)
     E    M   S  value
0    1  365 -10      4
1    1  365  10      4
2  365  365 -20      5
3  365  365  20      4
4  730  365  -5      5
5  730  365  15      4