【问题标题】:Conditionally calculated column for a Pandas DataFramePandas DataFrame 的条件计算列
【发布时间】:2017-03-01 06:23:24
【问题描述】:

我在 Pandas DataFrame 中有一个计算列,需要根据条件进行分配。例如:

if(data['column_a'] == 0):
    data['column_c'] = 0
else:
    data['column_c'] = data['column_b']

但是,这会返回错误:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我感觉这与必须以矩阵样式完成的事实有关。将代码更改为三元语句也不起作用:

data['column_c'] = 0 if data['column_a'] == 0 else data['column_b']

有人知道实现此目的的正确方法吗?将 apply 与 lambda 一起使用?我可以通过循环进行迭代,但我宁愿将其作为 Pandas 的首选方式。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你可以这样做:

    data['column_c'] = data['column_a'].where(data['column_a'] == 0, data['column_b'])
    

    这是矢量化的,您的尝试失败了,因为与 if 的比较不了解如何处理布尔值数组,因此出现错误

    例子:

    In [81]:
    df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
    df
    
    Out[81]:
              a         b         c
    0 -1.065074 -1.294718  0.165750
    1 -0.041167  0.962203  0.741852
    2  0.714889  0.056171  1.197534
    3  0.741988  0.836636 -0.660314
    4  0.074554 -1.246847  0.183654
    
    In [82]:
    df['d'] = df['b'].where(df['b'] < 0, df['c'])
    df
    
    Out[82]:
              a         b         c         d
    0 -1.065074 -1.294718  0.165750 -1.294718
    1 -0.041167  0.962203  0.741852  0.741852
    2  0.714889  0.056171  1.197534  1.197534
    3  0.741988  0.836636 -0.660314 -0.660314
    4  0.074554 -1.246847  0.183654 -1.246847
    

    【讨论】:

      【解决方案2】:

      使用 where() 和 notnull()

         data['column_c'] = data['column_b'].where(data['column_a'].notnull(), 0)
      

      【讨论】:

        【解决方案3】:

        另一种做法如下

        import numpy as np
        
        data['column_c'] = np.where(data['column_a'] == 0, data['column_a'], data['column_b'])
        

        【讨论】:

          猜你喜欢
          • 2022-11-10
          • 1970-01-01
          • 2013-01-15
          • 1970-01-01
          • 2018-12-17
          • 2019-03-11
          • 2017-12-15
          • 2021-08-05
          • 1970-01-01
          相关资源
          最近更新 更多