在许多情况下选择熊猫列变得笨拙

时间:2019-06-27 22:59:02

标签: python 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.对系列项目应用功能 3.使用修改后的系列更新DataFrame

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

谢谢!

2 个答案:

答案 0 :(得分:2)

在多种情况下,您可以使用eval使事情变得简单:

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

详细了解如何here动态求值。当然,此特定功能可以向量化为

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

答案 1 :(得分:1)

它将与update

一起使用
con=(df['rate']>1) & (df['rate_type']=='fixed') & (df['something']<= 'nothing')
df.update(df.loc[con,['rate']].apply(lambda x: x/100))