Подтвердить что ты не робот

Изменение определенных значений в нескольких столбцах 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
4b9b3361

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