Pandas:使用组手段创建新列以另一列为条件

nrc*_*001 3 python pandas

我正在尝试创建一个新列,其中包含以另一列的值为条件的组平均值。通过示例可以最好地解释这一点:

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)

Chr*_*s A 5

用于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)