【问题标题】:How to set pandas value by another value with any conditions如何在任何条件下通过另一个值设置熊猫值
【发布时间】:2021-02-03 16:38:12
【问题描述】:

我需要在 pandas 数据框中的任何条件下将值更改为另一个值,但出现错误:

>>> df
      X0  X1  X2
0      a   1  0
1      b   3  0
2      c   2  0
3      c   4  0

公式: if (X0 != "a" and X0 != "b") 设置 X2 = X0+X1

结果将是:

>>> df
      X0  X1  X2
0      a   1  0
1      b   3  0
2      c   2  c2
3      c   4  c4

我尝试使用:

df.loc[df.X0!= "a" and df.X0!= "b" ,"X2"]= df.X1+dfX2

但是得到“ValueError: 一个Series的真值是不明确的。使用a.empty、a.bool()、a.item()、a.any()或a.all()。”

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    一种有效的方法是使用np.where,并正确陈述您的条件:

    import numpy as np
    df['X2'] = np.where((df['X0'] != 'a') & (df['X0'] !='b'),df[['X0','X1']].astype(str).apply(''.join,1),0)
    

    哪个打印:

    df
    Out[47]: 
      X0  X1  X2
    0  a   1   0
    1  b   3   0
    2  c   2  c2
    3  c   4  c4
    

    【讨论】:

      【解决方案2】:

      开始于:

      df = pd.DataFrame({'X0':['a','b','c','c'],'X1':[1,3,2,4],'X2':[0,0,0,0]})
      

      您收到错误是因为您没有括号并且没有使用“&”运算符。如果你想用.loc 来做这件事,这行得通:

      df.loc[(df.X0 != "a") & (df.X0 != "b"), "X2"]= df.X0 + df.X1.astype(str)
      
      print(df)
        X0  X1  X2   
      0  a   1   0    
      1  b   3   0   
      2  c   2   c2  
      3  c   4   c4  
      

      【讨论】:

      • 嗨瑞克!请解释我的错:为什么你使用按位“&”而不是“and”?
      • 我收到警告:“SettingWithCopyWarning: 试图在数据帧的切片副本上设置值请参阅文档中的注意事项:pandas.pydata.org/pandas-docs/stable/user_guide/… iloc._setitem_with_indexer(indexer,值,self.name)"
      • 您好...这是因为您正在对两个 numpy 布尔数组进行 vectorized 逐元素逐位比较,并且 numpy 使用 & 运算符那。括号中的每个表达式都是 True/False 的 4 元素 numpy 数组。使用 and 时会出现错误,因为它会尝试将两个数组作为一个整体进行比较,而 numpy 不允许这样做。另见stackoverflow.com/questions/22646463/…
      • SettingWithCopyWarning 通常表示您正在处理已在之前的步骤中选择的数据框的子集的视图,例如 df = df_orig[condition] 。如果是这种情况,您可以使用df = df_orig[condition].copy() 来消除警告。
      • 什么是更有效的方法 np.where 或 loc.[]?
      【解决方案3】:

      这是一个简单的解决方案。 如果您有任何问题,请随时提出。

      dff = pd.DataFrame({'X0':['a','b','c','c'],'X1':[1,3,2,4],'X2':[0,0,0,0]})
      _condition1 = dff.X0 != 'a'
      _condition2 = dff.X0 != 'b'
      dff['X2'] = np.where(_condition1&_condition2,dff.X0+dff.X1.astype(str),0)
      dff
      

      输出

      【讨论】:

      • 谢谢!比上一个更清晰。
      • (我的意思是“sophods”帖子)
      • 别忘了标记你的答案结束这个帖子,其他社区成员可以从中受益。
      猜你喜欢
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 2021-08-06
      • 2020-11-20
      • 1970-01-01
      • 2021-08-23
      • 2019-07-06
      • 1970-01-01
      相关资源
      最近更新 更多