pandas - Pandas 分组和仅对某一列进行求和

下面是一个很小的例子,展示了我所面对的问题,初始状态为以下(我只用字典作示范):


A = [{'D': '16.5.2013', 'A':1, 'B': 0.0, 'C': 2}, {'D': '16.5.2013', 'A':1, 'B': 0.0, 'C': 4}, {'D': '16.5.2013', 'A':1, 'B': 0.5, 'C': 7}]
df = pd.DataFrame(A)
>>> df
 A B C D
0 1 0.0 2 16.5.2013
1 1 0.0 4 16.5.2013
2 1 0.5 7 16.5.2013

如何从df获取df_new:


A_new = [{'D': '16.5.2013', 'A':1, 'B': 0.0, 'C': 6}, {'D': '16.5.2013', 'A':1, 'B': 0.5, 'C': 7}]
df_new = pd.DataFrame(A_new)

>>> df_new
 A B C D
0 1 0.0 6 16.5.2013
1 1 0.5 7 16.5.2013

'C '列的第一行和第二行是相加的,因为'B '对于这两行是相同的。其余部分保持不变,例如,列'A '未求和,列'D '未更改。假设我只有df,我想得到df_new,我该怎么做。

提前致谢。

时间:

如果A和D在B分组时总是相等的,那么你可以只用GROUP BY ,BD和sum C:


df.groupby(['A', 'B', 'D'], as_index = False).agg(sum)

输出:


 A B D C
0 1 0.0 16.5.2013 6
1 1 0.5 16.5.2013 7

或者:

你基本上想要聚合按列'B '分组的数据。要聚合列C,你只需使用内置的sum函数,对于其他列,你基本上只想选择一个唯一值,因为你认为它们在组内始终是相同的。要做到这一点,只需编写一个非常简单的函数,只需获取第一个值即可聚合这些列。


# will take first value of the grouped data
sole_value = lambda x : list(x)[0]

#dictionary that maps columns to aggregation functions
agg_funcs = {'A' : sole_value, 'C' : sum, 'D' : sole_value}

#group and aggregate
df.groupby('B', as_index = False).agg(agg_funcs)

输出:


 B A C D
0 0.0 1 6 16.5.2013
1 0.5 1 7 16.5.2013

当然,你需要确保在A列和D列中是绝对相等的值,否则你可能会有错误的数据。

首先创建由B分组的df_new,其中我为每个列获取组中的第一行:


In [17]: df_new = df.groupby('B', as_index=False).first()

然后将C列特定地计算为每个组的总和:


In [18]: df_new['C'] = df.groupby('B', as_index=False)['C'].sum()['C']

In [19]: df_new
Out[19]: 
 B A C D
0 0.0 1 6 16.5.2013
1 0.5 1 7 16.5.2013

如果你的列数有限,你也可以一步完成(但是,如果你有更多列,上面的内容会更方便),方法是为每列指定所需的函数:


In [20]: df_new = df.groupby('B', as_index=False).agg({'A':'first', 'C':'sum', 'D':'first'})

...