我试图创建一个新的列,其中包含以其他列的值为条件的组均值。最好用示例来解释:
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
我已经设法解决了这个问题,但是我正在寻找更少的代码行并且可能更高效的东西。
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
我尝试使用转换功能,但对我不起作用
df.loc[: , 'a'] = df.groupby('group').transform(lambda x: x[x['B']==1]['A'].mean())
答案 0 :(得分:4)
使用Series.where
仅过滤所需的col A
的值,然后过滤groupby
和transform
:
df['a'] = df['A'].where(df['B'].eq(1)).groupby(df['group']).transform('mean')
[出]
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