【问题标题】:pandas : update value if condition in 3 columns are metpandas:如果满足 3 列中的条件,则更新值
【发布时间】:2014-02-11 08:03:30
【问题描述】:

我有一个这样的数据框:

In[1]: df
Out[1]:
      A      B       C            D
1   blue    red    square        NaN
2  orange  yellow  circle        NaN
3  black   grey    circle        NaN

我想在满足 3 个条件时更新 D 列。例如:

df.ix[ np.logical_and(df.A=='blue', df.B=='red', df.C=='square'), ['D'] ] = 'succeed'

它适用于前两个条件,但它不适用于第三个条件,因此:

df.ix[ np.logical_and(df.A=='blue', df.B=='red', df.C=='triangle'), ['D'] ] = 'succeed'

结果完全相同:

In[1]: df
Out[1]:
      A      B       C            D
1   blue    red    square        succeed
2  orange  yellow  circle        NaN
3  black   grey    circle        NaN

【问题讨论】:

  • df.ix[(df.A=='blue') & (df.B=='red') & (df.C=='square'),'D']='success' 工作吗?

标签: python pandas


【解决方案1】:

使用:

df[ (df.A=='blue') & (df.B=='red') & (df.C=='square') ]['D'] = 'succeed'

给出警告:

/usr/local/lib/python2.7/dist-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

实现这一目标的更好方法似乎是:

df.loc[(df['A'] == 'blue') & (df['B'] == 'red') & (df['C'] == 'square'),'D'] = 'M5'

【讨论】:

  • df.loc 比前一个要快得多。
  • 这是一个非常描述性和有用的答案,谢谢
  • 这是惯用的解决方案。另一种选择是在loc 中使用可调用对象,如下所示:df.loc[lambda x: (x[‘A’] == ‘blue’) & (x[‘B’] == ‘red’) & (x[‘C’] == ‘square’), ‘D’] = ‘succeed’]。记住:df.loc[row_mask, cols] = assigned_val
  • 这个解决方案似乎是标准解决方案,但它需要很长时间。就我而言,分配操作永远不会完成。是否可以加快此操作?
【解决方案2】:

你可以试试这个:

df[ (df.A=='blue') & (df.B=='red') & (df.C=='square') ]['D'] = 'succeed'

【讨论】:

  • 是的,它有效。虽然我仍然不明白“numpy.logical_and”和“&”之间的区别。谢谢
  • 你也可以在df[ (df.A=='blue') | (df.B=='red') ]这样的查询中使用or
  • 如果在使用上述解决方案时收到警告A value is trying to be set on a copy of a slice from a DataFrame.,请执行以下操作:df.loc[ (df.A=='blue') & (df.B=='red') & (df.C=='square'), 'D'] = 'succeed'
  • 就像对遇到此问题并认为他们将对其进行修剪的任何人的旁注...您必须在条件周围加上括号,否则运算符优先级会导致问题。经验之声。 :-P
【解决方案3】:

你可以试试:

df['D'] = np.where((df.A=='blue') & (df.B=='red') & (df.C=='square'), 'succeed')

此答案可能会为您的问题提供详细的答案: Update row values where certain condition is met in pandas

【讨论】:

    【解决方案4】:

    新答案中可能已经暗示了这种格式,但下面的内容实际上对我有用。

    df['D'].loc[(df['A'] == 'blue') & (df['B'] == 'red') & (df['C'] == 'square')] = 'succeed'

    【讨论】:

      【解决方案5】:

      logical_and的第三个参数是赋值用来存储结果的数组。

      目前,@TimRich 提供的方法可能是最好的。在 pandas 0.13(开发中)中,有一个新的实验性 query 方法。试试吧!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-06
        • 1970-01-01
        • 2019-06-05
        • 2021-03-17
        • 1970-01-01
        • 1970-01-01
        • 2022-10-07
        • 2020-08-18
        相关资源
        最近更新 更多