【问题标题】:Pandas: update column values from another column if criteria [duplicate]Pandas:如果条件[重复],则从另一列更新列值
【发布时间】:2019-01-18 02:42:48
【问题描述】:

我有一个数据框:

   A B

1: 0 1
2: 0 0 
3: 1 1
4: 0 1
5: 1 0

如果 column A 中的值等于 0,我想用 column B 的值更新 DataFrame 的每个项目 column A。 p>

我要获取的DataFrame:

   A B

1: 1 1
2: 0 0 
3: 1 1
4: 1 1
5: 1 0

我已经尝试过这段代码

df['A'] = df['B'].apply(lambda x: x if df['A'] == 0 else df['A'])

它会引发错误:The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

    标签: python pandas lambda


    【解决方案1】:

    使用where

    In [348]: df.A = np.where(df.A.eq(0), df.B, df.A)
    
    In [349]: df
    Out[349]:
        A  B
    1:  1  1
    2:  0  0
    3:  1  1
    4:  1  1
    5:  1  0
    

    【讨论】:

    • 哪种解决方案在时间上更有效,你的还是 Rusabh 的?
    【解决方案2】:
    df['A'] = df.apply(lambda x: x['B'] if x['A']==0 else x['A'], axis=1)
    

    输出

        A  B
    1:  1  1
    2:  0  0
    3:  1  1
    4:  1  1
    5:  1  0
    

    【讨论】:

      【解决方案3】:

      您可以使用掩码来执行此操作:

      df = pd.DataFrame()
      df['A'] = [0,0,1,0,1]
      df['B'] = [1,0,1,1,0]
      mask = (df.A == 0)
      df.loc[mask,'A'] = df.loc[mask,'B']
      
          A   B
      0   1   1
      1   0   0
      2   1   1
      3   1   1
      4   1   0
      

      编辑: 好的,这实际上是一个低效的解决方案:

      %timeit df.loc[mask,'A'] = df.loc[mask,'B']
      %timeit df.apply(lambda x: x['B'] if x['A']==0 else x['A'], axis=1)
      %timeit np.where(df.A.eq(0), df.B, df.A)
      
      5.52 ms ± 556 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      1.27 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      796 µs ± 89.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      

      感谢零使用 np.where 提供的这种高效解决方案!

      【讨论】:

        猜你喜欢
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 2010-12-17
        • 2020-03-11
        • 2013-11-23
        • 2021-02-15
        • 1970-01-01
        相关资源
        最近更新 更多