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 列中的条件,则更新值的主要内容,如果未能解决你的问题,请参考以下文章
如果条件满足,则更新表。 (将表b中的值更新为a)所需的相应值[重复]