[英]Replacing column values in a pandas DataFrame
我正在嘗試替換數據幀的一列中的值。 列 ('female') 僅包含值 'female' 和 'male'。
我嘗試了以下方法:
w['female']['female']='1'
w['female']['male']='0'
但收到與先前結果完全相同的副本。
理想情況下,我希望獲得一些類似於以下循環元素的輸出。
if w['female'] =='female':
w['female'] = '1';
else:
w['female'] = '0';
我已經查看了 gotchas 文檔( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ),但無法弄清楚為什么什么也沒發生。
任何幫助將不勝感激。
如果我理解正確,你想要這樣的東西:
w['female'] = w['female'].map({'female': 1, 'male': 0})
(這里我將值轉換為數字而不是包含數字的字符串。如果您真的需要,您可以將它們轉換為"1"
和"0"
,但我不確定您為什么想要那樣。)
原因您的代碼不工作是因為使用['female']
柱(第二'female'
在你的w['female']['female']
並不意味着“選擇行,其中的值是'女性'”。 這意味着選擇索引為“女性”的行,其中在您的 DataFrame 中可能沒有任何行。
您可以使用 loc 編輯數據幀的子集:
df.loc[<row selection>, <column selection>]
在這種情況下:
w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1
w.female.replace(to_replace=dict(female=1, male=0), inplace=True)
輕微變化:
w.female.replace(['male', 'female'], [1, 0], inplace=True)
這也應該有效:
w.female[w.female == 'female'] = 1
w.female[w.female == 'male'] = 0
您還可以將apply
與.get
一起使用,即
w['female'] = w['female'].apply({'male':0, 'female':1}.get)
:
w = pd.DataFrame({'female':['female','male','female']})
print(w)
數據框w
:
female
0 female
1 male
2 female
使用apply
替換字典中的值:
w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)
結果:
female
0 1
1 0
2 1
注意:如果數據框中列的所有可能值都在字典中定義,則應使用字典apply
,否則字典中未定義的值將為空。
這是非常緊湊的:
w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0
另一個不錯的:
w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)
或者,對於這些類型的賦值,有內置函數 pd.get_dummies:
w['female'] = pd.get_dummies(w['female'],drop_first = True)
這為您提供了一個包含兩列的數據框,一個用於 w['female'] 中出現的每個值,您刪除其中的第一列(因為您可以從剩下的列中推斷出它)。 新列將自動命名為您替換的字符串。
如果您有具有兩個以上可能值的分類變量,這將特別有用。 該函數創建了區分所有情況所需的盡可能多的虛擬變量。 請注意,不要將整個數據框分配給單個列,而是如果 w['female'] 可以是 'male'、'female' 或 'neutral',請執行以下操作:
w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)
然后你會留下兩個新的列,給你“女性”的虛擬編碼,你擺脫了帶有字符串的列。
Series.map
和Series.fillna
如果您的列包含的字符串多於female
和male
,則在這種情況下Series.map
將失敗,因為它會為其他值返回NaN
。
這就是為什么我們必須用fillna
鏈接它:
.map
失敗的示例:
df = pd.DataFrame({'female':['male', 'female', 'female', 'male', 'other', 'other']})
female
0 male
1 female
2 female
3 male
4 other
5 other
df['female'].map({'female': '1', 'male': '0'})
0 0
1 1
2 1
3 0
4 NaN
5 NaN
Name: female, dtype: object
對於正確的方法,我們將map
與fillna
,因此我們用原始列中的值填充NaN
:
df['female'].map({'female': '1', 'male': '0'}).fillna(df['female'])
0 0
1 1
2 1
3 0
4 other
5 other
Name: female, dtype: object
w.replace({'female':{'female':1, 'male':0}}, inplace = True)
上面的代碼將 'female' 替換為 1,'male' 替換為 0,僅在 'female' 列中
w.female = np.where(w.female=='female', 1, 0)
如果有人正在尋找一個 numpy 解決方案。 這對於根據條件替換值很有用。 if 和 else 條件都是np.where()
固有的。 如果列除'male'
之外還包含許多唯一值,則使用df.replace()
的解決方案可能不可行,所有這些值都應替換為0
。
另一種解決方案是連續使用df.where()
和df.mask()
。 這是因為它們都沒有實現 else 條件。
w.female.where(w.female=='female', 0, inplace=True) # replace where condition is False
w.female.mask(w.female=='female', 1, inplace=True) # replace where condition is True
我認為在回答中應該指出您在上面建議的所有方法中獲得哪種類型的對象:它是 Series 還是 DataFrame。
當你得到w.female.
或w[[2]]
(假設 2 是您的列數),您將返回 DataFrame。 因此,在這種情況下,您可以使用 DataFrame 方法,例如.replace
。
當您使用.loc
或iloc
您會返回 Series,而 Series 沒有.replace
方法,因此您應該使用apply
、 map
等方法。
dic = {'female':1, 'male':0}
w['female'] = w['female'].replace(dic)
.replace 有一個字典作為參數,您可以在其中更改並執行您想要或需要的任何操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.