快速熊猫问题:
我通过一系列应用来清除数据框各个列中的值:
# 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)
,但我也无法使它正常工作。
谢谢!
答案 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))