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

Edu*_*ira 34 python pandas

我有这样的数据帧:

In[1]: df
Out[1]:
      A      B       C            D
1   blue    red    square        NaN
2  orange  yellow  circle        NaN
3  black   grey    circle        NaN
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有完全相同的结果:

In[1]: df
Out[1]:
      A      B       C            D
1   blue    red    square        succeed
2  orange  yellow  circle        NaN
3  black   grey    circle        NaN
Run Code Online (Sandbox Code Playgroud)

Pra*_*een 35

运用

df[ (df.A=='blue') & (df.B=='red') & (df.C=='square') ]['D'] = 'succeed'
Run Code Online (Sandbox Code Playgroud)

给出以下警告

/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
Run Code Online (Sandbox Code Playgroud)

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

df.loc[(df['A'] == 'blue') & (df['B'] == 'red') & (df['C'] == 'square'),'D'] = 'M5'
Run Code Online (Sandbox Code Playgroud)

  • df.loc比以前的方法快得多。 (2认同)

Tim*_*Tim 24

你可以试试这个:

df[ (df.A=='blue') & (df.B=='red') & (df.C=='square') ]['D'] = 'succeed'
Run Code Online (Sandbox Code Playgroud)

  • 如果收到警告`在使用上述解决方案时,尝试在DataFrame的切片副本上设置一个值,请执行以下操作:`df.loc [(df.A =='blue')&(df.B =='red')&(df.C =='square'),'D'] ='success'` (19认同)
  • 就像碰到任何遇到此问题并认为自己将要减少的人的旁注一样,您必须在条件周围加上括号,否则运算符优先级会引起问题。经验之声。:-P (3认同)

小智 6

你可以尝试:

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

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