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'
Ответ 3
Вы можете попробовать:
df['D'] = np.where((df.A=='blue') & (df.B=='red') & (df.C=='square'), 'succeed')
Этот ответ может дать подробный ответ на ваш вопрос:
Обновить значения строк, где выполняется определенное условие в pandas
Ответ 4
Третий параметр logical_and - назначить массив, используемый для хранения результата.
В настоящее время метод @TimRich может быть лучшим. В pandas 0,13 (в разработке) появился новый экспериментальный метод query. Попробуй!
Ответ 5
Этот формат мог подразумеваться в новых ответах, но следующий бит действительно работал для меня.
df['D'].loc[(df['A'] == 'blue') & (df['B'] == 'red') & (df['C'] == 'square')] = 'succeed'