我可能在做一些非常愚蠢的事情,但我很難過。有條件替換熊貓
我有一個數據框,我想用零替換特定列中超過值的值。我還以爲這是實現這一目標的一種方式:
df[df.my_channel > 20000].my_channel = 0
如果我的頻道複製到一個新的數據幀很簡單:
df2 = df.my_channel
df2[df2 > 20000] = 0
這不正是我想要的東西,但似乎不起作用將通道作爲原始數據幀的一部分。
非常感謝。
本
我可能在做一些非常愚蠢的事情,但我很難過。有條件替換熊貓
我有一個數據框,我想用零替換特定列中超過值的值。我還以爲這是實現這一目標的一種方式:
df[df.my_channel > 20000].my_channel = 0
如果我的頻道複製到一個新的數據幀很簡單:
df2 = df.my_channel
df2[df2 > 20000] = 0
這不正是我想要的東西,但似乎不起作用將通道作爲原始數據幀的一部分。
非常感謝。
本
.ix
索引工作好大熊貓之前的版本0.20.0,但由於大熊貓0.20.0中,.ix
索引是deprecated,所以你應該避免使用它。相反,您可以使用.loc
或iloc
索引器。你可以解決這個問題:
mask = df.my_channel > 20000
column_name = 'my_channel'
df.loc[mask, column_name] = 0
mask
幫助您選擇其中df.my_channel > 20000
是True
行,而df.loc[mask, column_name] = 0
0值設置爲所選擇的行,其中mask
持有這名字是column_name
列。
更新: 在這種情況下,你應該使用loc
,因爲如果你使用iloc
,你會得到一個NotImplementedError
告訴你,在一個整數類型iLocation基於布爾索引不可用。
lmiguelvargasf的答案應該被標記爲正確的答案,因爲最近的熊貓變化。 – ramhiser
你可以使用'iloc '這種面具?它似乎並沒有爲我工作(雖然'loc'工作正常)。如果'iloc'在這種情況下不起作用,那麼值得澄清一下'loc'應該替代'ix'來解決這個問題,而在其他情況下可能會被'iloc'替代? – LangeHaare
@LangeHaare,我剛剛嘗試了你所說的話,你說得對,它對'iloc'不起作用。我會更新我的答案來解決這個問題。非常感謝你讓我知道。 – lmiguelvargasf
嘗試
df.ix[df.my_channel > 20000, 'my_channel'] = 0
謝謝。我發現我自己的解決方案,這是:df.my_channel [df.my_channel> 20000] = 0 – BMichell
@BMichell我認爲你的解決方案可能會開始給你0.13的警告,沒有機會嘗試 – lowtech
產量錯誤: /opt/anaconda3/envs/python35/lib/python3.5/site-packages/ipykernel_launcher.py:1:SettingWithCopyWarning: 正嘗試在來自DataFrame的切片的副本上設置一個值 請參閱該文檔:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 「」「啓動IPython內核的入口點 –
我個人比較喜歡使用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)
我也只喜歡np.where「。」需要從聲明中刪除。所以它應該是。 df ['my_channel'] = np.where(df.my_channel> 20000,0,df.my_channel) –
發現了什麼,我認爲你正在尋找[這裏]( http://stackoverflow.com/q/37841525/2662901)。 – feetwet