【问题标题】:How to use .loc to set as other column values in pandas如何使用 .loc 设置为 pandas 中的其他列值
【发布时间】:2019-04-12 17:56:33
【问题描述】:

例如,我有一个数据框:

    cond  value1  value2
0   True       1       1
1  False       3       5
2   True      34       2
3   True      23      23
4  False       4       2

我希望在cond=True 时将value1 替换为value2*2。所以我想要的结果是:

    cond  value1  value2
0   True       2       1
1  False       3       5
2   True       4       2
3   True      46      23
4  False       4       2

我可以通过以下代码实现:

 def convert(x):
     if x.cond:
         x.value1= x.value2*2
     return x
 data = data.apply(lambda x: convert(x),axis=1)

我认为当数据很大时它会很慢。我通过.loc试了一下,但是不知道怎么设置值。

如何通过.loc或者其他简单的方式实现呢?提前致谢。

【问题讨论】:

    标签: python pandas python-3.6


    【解决方案1】:

    使用np.where

    df['value1'] = np.where(df.cond,df.value2*2,df.value1)
    
    print(df)
        cond  value1  value2
    0   True       2       1
    1  False       3       5
    2   True       4       2
    3   True      46      23
    4  False       4       2
    

    【讨论】:

      【解决方案2】:

      你可以使用where/mask:

      df.value1 = df.value1.mask(df.cond, df.value2*2)
      # Or,
      # df.value1 = df.value1.where(~df.cond, df.value2*2)
      
      print(df)
          cond  value1  value2
      0   True       2       1
      1  False       3       5
      2   True       4       2
      3   True      46      23
      4  False       4       2
      

      【讨论】:

      • pd.mask 是 pandas 的属性吗?谢谢我学到了一些新东西!
      • 对我来说效果很好,现在我没有收到 setitem 错误。
      【解决方案3】:

      创建布尔掩码和多个仅过滤的行:

      mask = df.cond
      df.loc[mask, 'value1'] =  df.loc[mask, 'value2'] * 2
      print (df)
          cond  value1  value2
      0   True       2       1
      1  False       3       5
      2   True       4       2
      3   True      46      23
      4  False       4       2
      

      【讨论】:

      • 类似的问题我已经看过很多次了。为什么不创建像How to Pivot 这样的问题,并使用 timeit 值做出所有可能的答案。因此,它将对其他人很好的参考。
      • @SandeepKadapa - 是的,这个想法应该在像pivotpivot_table 和类似的巨大相关函数中实现,但这里不确定应该回答什么——只有我们的 4 个解决方案?现在我不知道如何扩展解决方案/场景的好方法。
      • @jezrael 我同意。
      • df.loc[mask, 'value1'] = df['value2'] * 2 也可以吗?是否需要在第二列上应用相同的 mask
      • @OrenMilman - 两种解决方案都运行良好。不同之处在于,如果使用诸如interpolate 之类的复杂操作来提高性能,则最好仅将其应用于过滤的行-例如10 个匹配行与所有行,例如10k 行。
      猜你喜欢
      • 2021-11-16
      • 2019-09-04
      • 2019-12-27
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      相关资源
      最近更新 更多