猿问

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

我已经设法解决了这个问题,但我正在寻找代码行更少,可能更有效率的东西。


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())


料青山看我应如是
浏览 66回答 1
1回答

qq_花开花谢_0

使用 Series.where 仅筛选所需的 col 值,然后分组并转换:Adf['a'] = df['A'].where(df['B'].eq(1)).groupby(df['group']).transform('mean')[输出]          A  B group           a0  59000000  1    IT  41337100.01  65000000  1    IT  41337100.02    434000  0    IT  41337100.03    434000  1    MV    222650.04    434000  0    MV    222650.05    337000  0    MV    222650.06     11300  1    IT  41337100.07     11300  1    MV    222650.08     11300  0    MV    222650.0
随时随地看视频慕课网APP

相关分类

Python
我要回答