web-dev-qa-db-ja.com

条件付き置換Pandas

私はおそらく非常に愚かなことをしていますが、私は困惑しています。

データフレームがあり、値を超える特定の列の値をゼロに置き換えたい。これはこれを達成する方法だと思っていました。

df[df.my_channel > 20000].my_channel = 0

チャンネルを新しいデータフレームにコピーするのは簡単です。

df2 = df.my_channel 

df2[df2 > 20000] = 0

これはまさに私が望むことをしますが、元のデータフレームの一部としてチャネルで動作しないようです。

88
BMichell

.ixインデクサーは、0.20.0より前のpandasバージョンでは問題なく機能しますが、pandas 0.20.0以降、.ixインデクサーは 非推奨 なので、使用しないでください。それ。代わりに、.locまたはilocname__インデクサーを使用できます。この問題は次の方法で解決できます。

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

maskname__は、df.my_channel > 20000Truename__である行を選択するのに役立ち、df.loc[mask, column_name] = 0は、名前がcolumn_nameである列のmaskname__holdsが選択された行に値0を設定します。

更新:この場合、locname__を使用する必要があります。ilocname__を使用すると、NotImplementedErrorname__が表示され、iLocation整数型に基づいたブールインデックスは使用できません

124
lmiguelvargasf

試して

df.loc[df.my_channel > 20000, 'my_channel'] = 0

注:v0.20.0以降、ix廃止予定 に代わり、loc/ilocが採用されました。

67
lowtech

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)
20
seeiespi

元のデータフレームが更新されない理由は、 連鎖インデックス を使用すると、データフレームのビューではなくコピーを変更する可能性があるためです。 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'])
10
jpp

これを試して:

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)

0
R. Shams

lambdaSeriesDataFrame関数を使用するには、次のようにします。

f = lambda x: 0 if x>100 else 1
df['my_column'] = df['my_column'].map(f)

これが効率的な方法であるとは言いませんが、うまく機能します。

0
cyber-math