熊猫分组和总结只是某一列

时间:2014-05-22 08:28:31

标签: python pandas group-by

下面的

是一个最小的例子,显示了我面临的问题。让我们的初始状态如下(我只使用字典进行演示):

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,我该怎么做呢?如果可能的话,我真的想找到一些优雅的解决方案。

提前致谢。

2 个答案:

答案 0 :(得分:1)

假设其他列始终相同,不应特别对待。

首先创建按df_new分组的B,其中我将每列放在组中的第一行:

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'})

答案 1 :(得分:0)

如果A和D在按B分组时总是相等,那么你可以按A,B D和总和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列中具有绝对相等的值,否则您可能会保留错误的数据。