25

次の 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

なんで?次のように、2 行を書き出すことなく、「リンゴ」と「バナナ」の両方の値を変換するにはどうすればよいですか?

In [2]: df['apple'][df.cherry == 'bad'] = np.nan
In [3]: df['banana'][df.cherry == 'bad'] = np.nan
4

3 に答える 3

37

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

ビューとコピーを返す際のドキュメントを参照してください。割り当てがコピーに対して行われる (そして破棄される) 場合は、1 つの loc で行うと、パンダはオリジナルに割り当てる必要があることを巧みに認識します。

于 2013-11-08T20:14:12.477 に答える
4

これdf[['apple', 'banana']][df.cherry == 'bad'] = np.nanは、DataFrame のコピーに割り当てるためです。これを試して:

df.ix[df.cherry == 'bad', ['apple', 'banana']] = np.nan
于 2013-11-08T20:14:38.900 に答える