是一个最小的例子,显示了我面临的问题。让我们的初始状态如下(我只使用字典进行演示):
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,我该怎么做呢?如果可能的话,我真的想找到一些优雅的解决方案。
提前致谢。
答案 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列中具有绝对相等的值,否则您可能会保留错误的数据。