具有许多条件的熊猫柱选择变得难以处理

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (7)

Quick Pandas 的问题:

我使用对系列的应用来清理数据框的各列中的值:

# For all values in col 'Rate' over 1, divide by 100

df['rate'][df['rate']>1] = df['rate'][df['rate']>1].apply(lambda x: x/100)

当选择标准很简单时,这很好,例如df['rate']>1。但是,当您开始添加多个选择条件时,这会变得非常长:

df['rate'][(df['rate']>1) & (~df['rate'].isnull()) & (df['rate_type']=='fixed) & (df['something']<= 'nothing')] = df['rate'][(df['rate']>1) & (df['rate_type']=='fixed) & (df['something']<= 'nothing')].apply(lambda x: x/100)

最简洁的方法是:1。从DataFrame中拆分一列(作为一个系列)2。将一个函数应用于Series 3的项目。使用修改后的系列更新DataFrame

我尝试过使用df.update(),但这似乎不起作用。我也尝试过使用Series作为选择器,例如isin(Series),但是我也无法使用它。

谢谢!

提问于
用户回答回答于
con=(df['rate']>1) & (df['rate_type']=='fixed') & (df['something']<= 'nothing')
df.update(df.loc[con,['rate']].apply(lambda x: x/100))
用户回答回答于

当有多个条件时,您可以使用eval以下方法保持简单:

mask = df.eval("rate > 1 & rate_type == 'fixed' & something <= 'nothing'")
df.loc[mask, 'rate'] = df['rate'].apply(function)

了解更多关于动态计算表达式这里。当然,这个特定的功能可以被矢量化为

df.loc[mask, 'rate'] /= 100

扫码关注云+社区

领取腾讯云代金券