2014-02-06 186 views
36

我可能在做一些非常愚蠢的事情,但我很難過。有條件替換熊貓

我有一個數據框,我想用零替換特定列中超過值的值。我還以爲這是實現這一目標的一種方式:

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

如果我的頻道複製到一個新的數據幀很簡單:

df2 = df.my_channel 

df2[df2 > 20000] = 0 

這不正是我想要的東西,但似乎不起作用將通道作爲原始數據幀的一部分。

非常感謝。

+0

發現了什麼,我認爲你正在尋找[這裏]( http://stackoverflow.com/q/37841525/2662901)。 – feetwet

回答

49

.ix索引工作好大熊貓之前的版本0.20.0,但由於大熊貓0.20.0中,.ix索引是deprecated,所以你應該避免使用它。相反,您可以使用.lociloc索引器。你可以解決這個問題:

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

mask幫助您選擇其中df.my_channel > 20000True行,而df.loc[mask, column_name] = 0 0值設置爲所選擇的行,其中mask持有這名字是column_name列。

更新: 在這種情況下,你應該使用loc,因爲如果你使用iloc,你會得到一個NotImplementedError告訴你,在一個整數類型iLocation基於布爾索引不可用

+7

lmiguelvargasf的答案應該被標記爲正確的答案,因爲最近的熊貓變化。 – ramhiser

+1

你可以使用'iloc '這種面具?它似乎並沒有爲我工作(雖然'loc'工作正常)。如果'iloc'在這種情況下不起作用,那麼值得澄清一下'loc'應該替代'ix'來解決這個問題,而在其他情況下可能會被'iloc'替代? – LangeHaare

+2

@LangeHaare,我剛剛嘗試了你所說的話,你說得對,它對'iloc'不起作用。我會更新我的答案來解決這個問題。非常感謝你讓我知道。 – lmiguelvargasf

56

嘗試

df.ix[df.my_channel > 20000, 'my_channel'] = 0 
+6

謝謝。我發現我自己的解決方案,這是:df.my_channel [df.my_channel> 20000] = 0 – BMichell

+1

@BMichell我認爲你的解決方案可能會開始給你0.13的警告,沒有機會嘗試 – lowtech

+0

產量錯誤: /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內核的入口點 –

0

我個人比較喜歡使用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)

+0

我也只喜歡np.where「。」需要從聲明中刪除。所以它應該是。 df ['my_channel'] = np.where(df.my_channel> 20000,0,df.my_channel) –