簡體   English   中英

將逗號分隔字符串的 pandas DataFrame 列轉換為單熱編碼

[英]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

想象有一個更簡單的答案,或者我認為這比我們必須做的多個操作更簡單。

  1. 確保列具有以逗號分隔的唯一值

  2. 在內置參數中使用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=',') 

OUTPUT:

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM