Python/pandas中的if/then/else惯用语

18
在对整个Pandas数据框执行计算后,我需要回到原始数据并覆盖变量计算(通常将其设置为零),基于另一个或多个变量的值。有没有更简洁/惯用的方法来执行这种操作?
df['var1000'][df['type']==7] = 0
df['var1001'][df['type']==7] = 0
df['var1002'][df['type']==7] = 0
...
df['var1099'][df['type']==7] = 0

有没有一种类似于pandas的方法可以做到这样?

if (df['type']==7):
    df['var1000'] = 0
    df['var1001'] = 0
    df['var1002'] = 0
    ...
    df['var1099'] = 0

@cs95这怎么是在4年之后发布的问题的重复? - ayorgo
@ayorgo,重复项不仅仅可以根据时间顺序进行修复。在我看来,其他问题中的两个答案都比下面的答案(使用已弃用的函数添加内容)更好地回答了这个问题。 - cs95
@cs95如果在meta上提到这个话题,肯定会引起激烈的辩论。哦,等等... https://meta.stackexchange.com/a/147651看起来很合理,尽管横幅有些误导。顺便说一下,我注意到这个参考来源于http://pandas.pydata.org/pandas-docs/stable/user_guide/cookbook.html#idioms - ayorgo
1个回答

27
df.ix[df.type==7, ['var1001', 'var1002']] = 0

如果你要对所有列进行更改,只需执行df.ix[df.type==7] = 0。当然,如果你有一列名称列表需要替换值,你可以将该列表放在第二个位置中:

columnsToReplace = ['var1001', 'var1002', ...]
df.ix[df.type==8, columnsToReplace] = 0

6
并且可以使用:var10_cols = [col for col in df.columns if isinstance(col, basestring) and col.startswith('var10')] - Andy Hayden
2
不错!从食谱来到这里了! - Mohammad Yusuf
2
ix已被弃用,请使用.loc。 - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接