如何使用 grouby 应用涉及 pandas 数据框多列的多个函数?
How can I apply multiple functions involving multiple columns of a pandas dataframe with grouby?
考虑以下数据:
id
cat
date
max
score
1
s1
A
12/06
9
5.4
2
s1
B
12/06
10
5.4
3
s2
C
11/04
13
4.2
4
s2
D
11/04
28
10
5
s3
E
08/02
16
5.4
5
s3
F
08/02
6
5.4
我想按“id”分组并获得第一列 [cat, date] 但同时我想获得 max - score 列的平均值。
我认为这可以通过聚合来完成:
但是对于聚合我无法访问数据框的所有列。
id
cat
date
mean(max-score)
s1
A
12/06
4.1
s2
C
11/04
13.4
s3
E
08/02
5.6
你首先需要将max-score
赋值给mean(max-score)
,然后这是一个简单的groupby
+agg
:
(df.assign(**{'mean(max-score)': df['max']-df['score']})
.groupby('id', as_index=False)
.agg({'cat': 'first', 'date': 'first', 'mean(max-score)': 'mean'})
)
输出:
id cat date mean(max-score)
0 s1 A 12/06 4.1
1 s2 C 11/04 13.4
2 s3 E 08/02 5.6
从pandas0.25开始,还可以使用pd.namedAgg,一个很好用的功能:
df['diff'] = df['max'] - df['score']
df.groupby('id').agg(cat=pd.NamedAgg(columns='cat',aggfunc='first'),
date=pd.NamedAgg(columns='date',aggfunc='first'),
mean(max-score)=pd.NamedAgg(columns='diff',aggfunc='mean'))
考虑以下数据:
id | cat | date | max | score | |
---|---|---|---|---|---|
1 | s1 | A | 12/06 | 9 | 5.4 |
2 | s1 | B | 12/06 | 10 | 5.4 |
3 | s2 | C | 11/04 | 13 | 4.2 |
4 | s2 | D | 11/04 | 28 | 10 |
5 | s3 | E | 08/02 | 16 | 5.4 |
5 | s3 | F | 08/02 | 6 | 5.4 |
我想按“id”分组并获得第一列 [cat, date] 但同时我想获得 max - score 列的平均值。 我认为这可以通过聚合来完成:
但是对于聚合我无法访问数据框的所有列。
id | cat | date | mean(max-score) |
---|---|---|---|
s1 | A | 12/06 | 4.1 |
s2 | C | 11/04 | 13.4 |
s3 | E | 08/02 | 5.6 |
你首先需要将max-score
赋值给mean(max-score)
,然后这是一个简单的groupby
+agg
:
(df.assign(**{'mean(max-score)': df['max']-df['score']})
.groupby('id', as_index=False)
.agg({'cat': 'first', 'date': 'first', 'mean(max-score)': 'mean'})
)
输出:
id cat date mean(max-score)
0 s1 A 12/06 4.1
1 s2 C 11/04 13.4
2 s3 E 08/02 5.6
从pandas0.25开始,还可以使用pd.namedAgg,一个很好用的功能:
df['diff'] = df['max'] - df['score']
df.groupby('id').agg(cat=pd.NamedAgg(columns='cat',aggfunc='first'),
date=pd.NamedAgg(columns='date',aggfunc='first'),
mean(max-score)=pd.NamedAgg(columns='diff',aggfunc='mean'))