Изменение определенных значений в нескольких столбцах pandas DataFrame сразу
Предположим, у меня есть следующий DataFrame:
In [1]: df
Out[1]:
apple banana cherry
0 0 3 good
1 1 4 bad
2 2 5 good
Это работает как ожидалось:
In [2]: df['apple'][df.cherry == 'bad'] = np.nan
In [3]: df
Out[3]:
apple banana cherry
0 0 3 good
1 NaN 4 bad
2 2 5 good
Но это не так:
In [2]: df[['apple', 'banana']][df.cherry == 'bad'] = np.nan
In [3]: df
Out[3]:
apple banana cherry
0 0 3 good
1 1 4 bad
2 2 5 good
Почему? Как я могу достичь преобразования значений "яблока" и "банана", не выписывая две строки, как в
In [2]: df['apple'][df.cherry == 'bad'] = np.nan
In [3]: df['banana'][df.cherry == 'bad'] = np.nan
Ответы
Ответ 1
Вы должны использовать loc и сделать это без привязки:
In [11]: df.loc[df.cherry == 'bad', ['apple', 'banana']] = np.nan
In [12]: df
Out[12]:
apple banana cherry
0 0 3 good
1 NaN NaN bad
2 2 5 good
Обратитесь к документам возвращающим представление и копию, если вы привязываете выделение к копии (и отбрасываете), но если вы делаете это в одном loc, тогда pandas ловко понимает, что вы хотите назначить оригиналу.
Ответ 2
Это потому, что df[['apple', 'banana']][df.cherry == 'bad'] = np.nan
назначает копию DataFrame. Попробуйте следующее:
df.ix[df.cherry == 'bad', ['apple', 'banana']] = np.nan