2014-04-26 83 views
47

我試圖替換數據框的一列中的值。該列(「女性」)只包含「女性」和「男性」的值。熊貓:替換數據框中的列值

我曾嘗試以下:

w['female']['female']='1' 
w['female']['male']='0' 

但收到以前的結果完全相同的副本。

我會理想地喜歡得到一些類似下面的循環元素明智的輸出。

if w['female'] =='female': 
    w['female'] = '1'; 
else: 
    w['female'] = '0'; 

我已經通過陷阱文件(http://pandas.pydata.org/pandas-docs/stable/gotchas.html)看了,但無法弄清楚,爲什麼沒有任何反應。

任何幫助將不勝感激。

+0

哪裏循環? – theharshest

回答

96

如果我理解正確的,你想是這樣的:

w['female'] = w['female'].map({'female': 1, 'male': 0}) 

(在這裏,我將值轉換爲數字,而不是包含數字的字符串你可以將它們轉換爲"1""0",如果你真的想要,但我不知道爲什麼你要那個。)

您的代碼不工作是因爲一列(在w['female']['female']第二'female')使用['female']並不意味着「選擇行,其中的原因價值是'女'「。這意味着選擇索引爲'女'的行,其中DataFrame中可能沒有任何行。

+0

謝謝。正是我在找什麼。如果我將「女性」映射爲1而其他任何映射爲「0」。這將如何工作? – Black

+3

使用此而已,如果列中的所有值的map函數沒有指定地圖function.Column值給出將由南更換。 – Chandra

+0

我也建議使用'.loc'語法來避免'SettingWithCopyWarning':https://pandas.pydata.org/pandas-docs/stable/indexing.html#different-choices-for-indexing – NickBraunagel

54

您可以通過使用LOC編輯數據框的子集:

df.loc[<row selection>, <column selection>] 

在這種情況下:

w.loc[w.female != 'female', 'female'] = 0 
w.loc[w.female == 'female', 'female'] = 1 
+0

我該如何適應它,所以我並不需要通過條件來選擇特定的行,剛纔的所有行的特定列?因此,將列中的所有單元格更改爲特定值。 –

+1

@DhruvGhulati,將使用df.loc [:, <列選擇>] –

13

輕微變化:

w.female.replace(['male', 'female'], [1, 0], inplace=True) 
8

這也應該工作:

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male'] = 0 
5

或者有這些類型的作業的內置功能pd.get_dummies:

w['female'] = pd.get_dummies(w['female'],drop_first = True) 

這爲您提供了一個包含兩列的數據框,其中每列對應於w ['female']中的每個值放下第一個(因爲你可以從剩下的那個中推斷出來)。新列將自動命名爲您替換的字符串。

如果您的分類變量具有兩個以上的可能值,這將特別有用。該函數創建所需的虛擬變量以區分所有情況。千萬要注意了,你不分配整個數據幀一列,而是,當w [「女」]可能是「男性」,「女性」或「中性」,做這樣的事情:

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1]) 
w.drop('female', axis = 1, inplace = True) 

然後你留下了兩個新列給你「女」的僞編碼和你擺脫了與弦之列。

1

pandas還有一個叫做factorize的功能,您可以使用它來自動執行此類工作。它將標籤轉換爲數字:['male', 'female', 'male'] -> [0, 1, 0]。有關更多信息,請參閱this答案。