快速Pandas问题:
我通过在一个系列上使用apply来清理数据帧的各个列中的值:
# 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()
,但似乎不起作用。我也尝试过使用系列作为选择器,例如isin(Series)
,但我也不能让它工作。
谢谢!
发布于 2019-06-28 07:05:08
它将与update
一起工作
con=(df['rate']>1) & (df['rate_type']=='fixed') & (df['something']<= 'nothing')
df.update(df.loc[con,['rate']].apply(lambda x: x/100))
发布于 2019-06-28 07:03:53
当有多个条件时,您可以使用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
https://stackoverflow.com/questions/56799308
复制相似问题