【问题标题】:How can I "merge" rows by same value in a column in Pandas with aggregation functions?如何使用聚合函数在 Pandas 的列中“合并”相同值的行?
【发布时间】:2020-12-23 19:20:57
【问题描述】:

给定一列,我想对数据框中的行进行分组。然后我想收到一个编辑过的数据框,我可以决定哪个聚合函数有意义。默认值应该只是组中第一个条目的值。

(如果解决方案也适用于两列的组合,那就太好了)

示例

#!/usr/bin/env python

"""Test data frame grouping."""

# 3rd party modules
import pandas as pd


df = pd.DataFrame([{'id': 1, 'price': 123, 'name': 'anna', 'amount': 1},
                   {'id': 1, 'price':   7, 'name': 'anna', 'amount': 2},
                   {'id': 2, 'price':  42, 'name': 'bob', 'amount': 30},
                   {'id': 3, 'price':   1, 'name': 'charlie', 'amount': 10},
                   {'id': 3, 'price':   2, 'name': 'david', 'amount': 100}])
print(df)

给出数据框:

   amount  id     name  price
0       1   1     anna    123
1       2   1     anna      7
2      30   2      bob     42
3      10   3  charlie      1
4     100   3    david      2

我想得到:

amount  id     name  price
     3   1     anna    130
    30   2      bob     42
   110   3  charlie      3

所以:

  • id 列中具有相同值的条目属于一起。在该操作之后,应该仍然有一个 id 列,但它应该只有唯一值。
  • amountprice 中具有相同id 的所有值相加
  • 对于name,仅采用第一个(按数据帧的当前顺序)。

Pandas 可以做到这一点吗?

【问题讨论】:

  • df_new = df.groupby(df['id']).aggregate({'price': 'sum', 'name': 'first', 'amount': 'sum'}) 有什么问题?这不适用于您的用例吗?
  • 哈哈哈,好吧,我没试过。我只是认为这是一个函数应该是什么样子。很高兴它意外地确实有效。我将编辑我的问题并将其作为答案。

标签: python pandas


【解决方案1】:

你正在寻找

aggregation_functions = {'price': 'sum', 'amount': 'sum', 'name': 'first'}
df_new = df.groupby(df['id']).aggregate(aggregation_functions)

给了

    price     name  amount
id                        
1     130     anna       3
2      42      bob      30
3       3  charlie     110

【讨论】:

  • 是否有可应用于列的可用聚合函数的已发布列表?例如,你怎么知道'first' 是一个有效的函数?我一直在谷歌搜索这样的列表。我发现很多文章和教程都提到了许多的有效函数,但没有完整的列表。
  • 我不知道第一个在里面。我只是猜到了 :-) 对我来说,pandas 非常直观
  • @DanielGoldfarb 看看这个cmdlinetips.com/2019/10/…
  • 可用聚合函数的完整列表记录在这里:pandas.pydata.org/docs/reference/groupby.html
  • 这个答案是黄金。
【解决方案2】:

对于相同的列排序是必要的添加reindex,因为聚合dict

d = {'price': 'sum', 'name': 'first', 'amount': 'sum'}
df_new = df.groupby('id', as_index=False).aggregate(d).reindex(columns=df.columns)
print (df_new)
   amount  id     name  price
0       3   1     anna    130
1      30   2      bob     42
2     110   3  charlie      3

【讨论】:

  • 我不明白as_index=False 做了什么。你能告诉我区别吗? (+1 重新索引)
  • 这是为了不从列id返回索引,就像你的答案一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
相关资源
最近更新 更多