Pandas: значение обновления, если выполнено условие в 3 столбцах

У меня есть dataframe, как это:

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

и я хочу обновить столбец D, когда он соответствует 3 условиям. Пример:

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

Ответы

Ответ 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'

Ответ 2

Вместо этого вы можете попробовать:

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

Ответ 4

Третий параметр logical_and - назначить массив, используемый для хранения результата.

В настоящее время метод @TimRich может быть лучшим. В pandas 0,13 (в разработке) появился новый экспериментальный метод query. Попробуй!

Ответ 5

Этот формат мог подразумеваться в новых ответах, но следующий бит действительно работал для меня.

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