为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas:创建新列,其中组意味着以另一列为条件

Pandas:创建新列,其中组意味着以另一列为条件

料青山看我应如是 2022-08-25 15:49:49
我正在尝试创建一个包含组均值的新列,条件是另一列的值。这可以通过示例来最好地解释: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 group0  59000000  1    IT1  65000000  1    IT2    434000  0    IT3    434000  1    MV4    434000  0    MV5    337000  0    MV6     11300  1    IT7     11300  1    MV8     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         a0  59000000  1    IT  413371001  65000000  1    IT  413371002    434000  0    IT  413371003    434000  1    MV    2226504    434000  0    MV    2226505    337000  0    MV    2226506     11300  1    IT  413371007     11300  1    MV    2226508     11300  0    MV    222650我尝试过使用转换函数,但它对我不起作用df.loc[: , 'a'] = df.groupby('group').transform(lambda x: x[x['B']==1]['A'].mean())
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

使用 Series.where 仅筛选所需的 col 值,然后分组转换A

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


查看完整回答
反对 回复 2022-08-25
  • 1 回答
  • 0 关注
  • 65 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信