【问题标题】:Python/pandas idiom for if/then/else [duplicate]if/then/else 的 Python/pandas 习语 [重复]
【发布时间】:2013-08-23 02:05:58
【问题描述】:

在对整个 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

有没有熊猫的方式来做这样的事情?

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

【问题讨论】:

  • @cs95 这是 4 年后发布的问题的副本?
  • @ayorgo 重复项不仅必须根据时间顺序进行修复。 IMO 另一个问题中的两个答案都比下面的答案(使用不推荐使用的函数来添加内容)做得更好(更好)。
  • @cs95 我敢打赌,如果在 meta 上提及它会引发相当大的争论。哦,等等...meta.stackexchange.com/a/147651 看起来是合法的,虽然使横幅具有误导性。顺便说一句,我注意到的原因是因为来自pandas.pydata.org/pandas-docs/stable/user_guide/… 的引用

标签: python pandas


【解决方案1】:
df.ix[df.type==7, ['var1001', 'var1002']] = 0

如果您要在所有列上执行此操作,则只需执行 df.ix[df.type==7] = 0。或者当然,如果您有一个要替换其值的列的列表,您可以在第二个插槽中传递该列表:

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

【讨论】:

  • 并且可以使用:var10_cols = [col for col in df.columns if isinstance(col, basestring) and col.startswith('var10')]
  • 不错!从食谱来到这里!
  • ix 已弃用,请改用 .loc。