[英]Convert pandas DataFrame column of comma separated strings to one-hot encoded
我有一個由一列組成的大 dataframe(“數據”)。 列中的每一行由一個字符串組成,每個字符串由逗號分隔的類別組成。 我希望對這些數據進行一次熱編碼。
例如,
data = {"mesh": ["A, B, C", "C,B", ""]}
從這里我想得到一個 dataframe,包括:
index A B. C
0 1 1 1
1 0 1 1
2 0 0 0
我怎樣才能做到這一點?
請注意,您不是在與OHE打交道。
str.split
+ stack
+ get_dummies
+ sum
df = pd.DataFrame(data)
df
mesh
0 A, B, C
1 C,B
2
(df.mesh.str.split('\s*,\s*', expand=True)
.stack()
.str.get_dummies()
.sum(level=0))
df
A B C
0 1 1 1
1 0 1 1
2 0 0 0
apply
+ value_counts
(df.mesh.str.split(r'\s*,\s*', expand=True)
.apply(pd.Series.value_counts, 1)
.iloc[:, 1:]
.fillna(0, downcast='infer'))
A B C
0 1 1 1
1 0 1 1
2 0 0 0
pd.crosstab
x = df.mesh.str.split('\s*,\s*', expand=True).stack()
pd.crosstab(x.index.get_level_values(0), x.values).iloc[:, 1:]
df
col_0 A B C
row_0
0 1 1 1
1 0 1 1
2 0 0 0
想象有一個更簡單的答案,或者我認為這比我們必須做的多個操作更簡單。
確保列具有以逗號分隔的唯一值
在內置參數中使用get dummies將分隔符指定為逗號。 此默認值為管道分隔。
data = {"mesh": ["A, B, C", "C,B", ""]} sof_df=pd.DataFrame(data) sof_df.mesh=sof_df.mesh.str.replace(' ','') sof_df.mesh.str.get_dummies(sep=',')
A B C
0 1 1 1
1 0 1 1
2 0 0 0
如果類別受到控制(你知道有多少以及他們是誰),最佳答案來自@Tejeshar Gurram。 但是,如果您有很多潛在類別並且您對所有類別都不感興趣怎么辦。 說:
s = pd.Series(['A,B,C,', 'B,C,D', np.nan, 'X,W,Z'])
0 A,B,C,
1 B,C,D
2 NaN
3 X,W,Z
dtype: object
如果您只對假人的最終 df 類別 B 和 C 感興趣,我發現此解決方法可以完成這項工作:
cat_list = ['B', 'C']
list_of_lists = [ (s.str.contains(cat_, regex=False)==True).astype(bool).astype(int).to_list() for cat_ in cat_list]
data = {k:v for k,v in zip(cat_list,list_of_lists)}
pd.DataFrame(data)
B C
0 1 0
1 0 1
2 0 0
3 0 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.