我正在尝试创建一个新列,其中包含以另一列的值为条件的组平均值。通过示例可以最好地解释这一点:
df = pd.DataFrame({'A': [59000000, 65000000, 434000, 434000, 434000, 337000, 11300, 11300, 11300],
'B': [1, 1 , 0, 1, 0, 0, 1, 1, 0],
'group': ["IT", "IT", "IT", "MV", "MV", "MV", "IT", "MV", "MV"]})
df
A B group
0 59000000 1 IT
1 65000000 1 IT
2 434000 0 IT
3 434000 1 MV
4 434000 0 MV
5 337000 0 MV
6 11300 1 IT
7 11300 1 MV
8 11300 0 MV
Run Code Online (Sandbox Code Playgroud)
我已经设法解决了这个问题,但我正在寻找代码行数更少并且可能更高效的东西。
x = df.loc[df['B']==1].groupby('group', as_index=False)['A'].mean()
x.rename(columns = {'A':'a'}, inplace = True)
df = pd.merge(df, x, how='left', on='group')
A B group a
0 59000000 1 IT 41337100
1 65000000 1 IT 41337100
2 434000 0 IT 41337100
3 434000 1 MV 222650
4 434000 0 MV 222650
5 337000 0 MV 222650
6 11300 1 IT 41337100
7 11300 1 MV 222650
8 11300 0 MV 222650
Run Code Online (Sandbox Code Playgroud)
我尝试过使用转换函数,但它对我不起作用
df.loc[: , 'a'] = df.groupby('group').transform(lambda x: x[x['B']==1]['A'].mean())
Run Code Online (Sandbox Code Playgroud)
用于Series.where仅过滤您需要的 col 值A,然后groupby使用 和transform:
df['a'] = df['A'].where(df['B'].eq(1)).groupby(df['group']).transform('mean')
Run Code Online (Sandbox Code Playgroud)
[出去]
A B group a
0 59000000 1 IT 41337100.0
1 65000000 1 IT 41337100.0
2 434000 0 IT 41337100.0
3 434000 1 MV 222650.0
4 434000 0 MV 222650.0
5 337000 0 MV 222650.0
6 11300 1 IT 41337100.0
7 11300 1 MV 222650.0
8 11300 0 MV 222650.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
694 次 |
| 最近记录: |