私はおそらく非常に愚かなことをしていますが、私は困惑しています。
データフレームがあり、値を超える特定の列の値をゼロに置き換えたい。これはこれを達成する方法だと思っていました。
df[df.my_channel > 20000].my_channel = 0
チャンネルを新しいデータフレームにコピーするのは簡単です。
df2 = df.my_channel
df2[df2 > 20000] = 0
これはまさに私が望むことをしますが、元のデータフレームの一部としてチャネルで動作しないようです。
.ix
インデクサーは、0.20.0より前のpandasバージョンでは問題なく機能しますが、pandas 0.20.0以降、.ix
インデクサーは 非推奨 なので、使用しないでください。それ。代わりに、.loc
またはiloc
name__インデクサーを使用できます。この問題は次の方法で解決できます。
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
name__は、df.my_channel > 20000
がTrue
name__である行を選択するのに役立ち、df.loc[mask, column_name] = 0
は、名前がcolumn_name
である列のmask
name__holdsが選択された行に値0を設定します。
更新:この場合、loc
name__を使用する必要があります。iloc
name__を使用すると、NotImplementedError
name__が表示され、iLocation整数型に基づいたブールインデックスは使用できません。
np.where
関数は次のように機能します。
df['X'] = np.where(df['Y']>=50, 'yes', 'no')
あなたの場合、あなたは望むでしょう:
import numpy as np
df['my_channel'] = np.where(df.my_channel > 20000, 0, df.my_channel)
元のデータフレームが更新されない理由は、 連鎖インデックス を使用すると、データフレームのビューではなくコピーを変更する可能性があるためです。 docs は次のアドバイスを提供します。
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
+ブールインデックス条件がnotのときに元のシリーズを割り当てることにより、canを使用できます満足;ただし、最初の2つのソリューションは、指定された値のみを明示的に変更するため、クリーンです。
df['my_channel'] = np.where(df['my_channel'] > 20000, 0, df['my_channel'])
これを試して:
df.my_channel = df.my_channel.where(df.my_channel <= 20000, other= 0)
または
df.my_channel = df.my_channel.mask(df.my_channel > 20000, other= 0)
lambda
のSeries
でDataFrame
関数を使用するには、次のようにします。
f = lambda x: 0 if x>100 else 1
df['my_column'] = df['my_column'].map(f)
これが効率的な方法であるとは言いませんが、うまく機能します。