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

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

提前致谢。

最佳答案

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

首先创建按 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'})

关于python - Pandas 仅对某一列进行分组和求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23801559/

相关文章:

python - Django: `QuerySet.__nonzero__` 和 `QuerySet.exists` 之间有什么区别吗?

python - 在 Altair 中将图例制作成多列

python - 读取文本文件、操作字符串并以特定格式导出 csv

python - 加拿大的 Scattergeo 在 python 中使用 plotly

python - 通过 pandas 绘图界面绘制带有第二个 y 轴的 pandas 数据框时设置图例位置

python - Dask 中的 read_sql_table 返回 NoSuchTableError

python - 在 Pandas 中使用 groupby 将一列中的内容与另一列进行比较

mysql - 使用 select、group by 和 count 时如何获得非空结果集?

sql-server - SQL Server : how can I get the correct DB size from sys. master_files?

mysql - SQL 两个 "group by"在同一查询中