pandas:如果满足 3 列中的条件,则更新值

Posted

技术标签:

【中文标题】pandas:如果满足 3 列中的条件,则更新值【英文标题】:pandas : update value if condition in 3 columns are met 【发布时间】: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' 工作吗? 【参考方案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 方法。试试吧!

【讨论】:

以上是关于pandas:如果满足 3 列中的条件,则更新值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Pivot Table:按条件过滤时出错

如果在 R 中满足条件,则从前一行获取值并连接

Pandas:如果特定列满足特定条件,则选择行

如果条件满足,则更新表。 (将表b中的值更新为a)所需的相应值[重复]

如果所有行的列中只有一个值,则折叠 Pandas 数据框中的行

如果满足条件,则将正数更改为负数