回答:
.ix
インデクサーは0.20.0より前のpandasバージョンでは問題なく機能しますが、pandas 0.20.0以降、.ix
インデクサーは非推奨になっているため、使用しないでください。代わりに、.loc
またはiloc
インデクサーを使用できます。この問題は次の方法で解決できます。
mask = df.my_channel > 20000
column_name = 'my_channel'
df.loc[mask, column_name] = 0
または、1行で
df.loc[df.my_channel > 20000, 'my_channel'] = 0
mask
が含まれている行を選択するのに役立ちますdf.my_channel > 20000
がTrue
、名前がのdf.loc[mask, column_name] = 0
列にmask
保持されている選択された行に値0を設定しますcolumn_name
。
アップデート:
このケースでは、使用する必要がありますloc
あなたが使用している場合のでiloc
、あなたが得るNotImplementedError
ことを占います整数型のiLocationベースブールインデックスは使用できませんが。
元のデータフレームが更新されない理由は、連鎖インデックスによってデータフレームのビューではなくコピーが変更される可能性があるためです。ドキュメントはこの助言を与えます:
pandasオブジェクトに値を設定するときは、いわゆる連鎖インデックスを回避するように注意する必要があります。
あなたにはいくつかの選択肢があります:-
loc
+ブールインデックスloc
値の設定に使用でき、ブールマスクをサポートします。
df.loc[df['my_channel'] > 20000, 'my_channel'] = 0
mask
+ブールインデックスシリーズに割り当てることができます:
df['my_channel'] = df['my_channel'].mask(df['my_channel'] > 20000, 0)
または、シリーズを適切に更新できます。
df['my_channel'].mask(df['my_channel'] > 20000, 0, inplace=True)
np.where
+ブールインデックスあなたはできるあなたの状態のときに、あなたのオリジナルシリーズを割り当てることによって、numpyのを使用していない満足。ただし、最初の2つのソリューションは指定された値のみを明示的に変更するため、よりクリーンです。
df['my_channel'] = np.where(df['my_channel'] > 20000, 0, df['my_channel'])
私が使用するlambda
上での機能をSeries
するDataFrame
。このように:
f = lambda x: 0 if x>100 else 1
df['my_column'] = df['my_column'].map(f)
これが効率的な方法であるとは断言しませんが、問題なく機能します。
loc
ここではのように使用できると思います df.loc[: , 'my_column'] = df['my_column'].map(f)
。以下に追加したような高速かどうかはわかりません。