回答:
.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)。以下に追加したような高速かどうかはわかりません。