如何通过聚合函数将Pandas中的列中的行"合并"为相同的值?

Mar*_*oma 12 python pandas

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

(如果解决方案也适用于两列的组合,那将是很好的)

#!/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)
Run Code Online (Sandbox Code Playgroud)

给出数据帧:

   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
Run Code Online (Sandbox Code Playgroud)

我想得到:

amount  id     name  price
     3   1     anna    130
    30   2      bob     42
   110   3  charlie      3
Run Code Online (Sandbox Code Playgroud)

所以:

  • id列中具有相同值的条目属于一起.在该操作之后,应该仍然存在id列,但它应该只有唯一值.
  • 得到的所有值amount和得到的值price都相同id
  • 因为name,只采用第一个(按数据帧的当前顺序).

这是熊猫的可能吗?

Mar*_*oma 14

你在找

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

这使

    price     name  amount
id                        
1     130     anna       3
2      42      bob      30
3       3  charlie     110
Run Code Online (Sandbox Code Playgroud)

  • 可用聚合函数的完整列表记录在此处:https://pandas.pydata.org/docs/reference/groupby.html (5认同)
  • 是否有可应用于列的可用聚合函数的已发布列表?例如,你怎么知道“first”是一个有效的函数?我一直在谷歌上搜索这样的列表。我发现很多文章和教程都提到了*许多*的有效函数,但没有完整的列表。 (4认同)

jez*_*ael 7

对于相同的列,必须添加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
Run Code Online (Sandbox Code Playgroud)

  • 它不是像您的答案那样从“id”列返回索引。 (3认同)