我有一個 df 作為
name category dummy
USA fx,ft,fe 1
INDIA fx 13
我需要將其轉換為
name category_fx categoty_ft category_fe dummy
USA True True True 1
INDIA True False False 13
嘗試了 series.explode() 函式,但沒有得到這個輸出。
uj5u.com熱心網友回復:
通過and轉換為布林值的Series.str.get_dummies按列使用:category0,1DataFrame.astypeDataFrame.add_prefix
c = df.columns.difference(['category'], sort=False).tolist()
df = (df.set_index(c)['category']
.str.get_dummies(',')
.astype(bool)
.add_prefix('category_')
.reset_index())
print (df)
name category_fe category_ft category_fx
0 USA True True True
1 INDIA False False True
編輯:如果需要用多列替換一列,您可以使用:
df1 = (df['category']
.str.get_dummies(',')
.astype(bool)
.add_prefix('category_'))
pos = df.columns.get_loc('category')
df = pd.concat([df.iloc[:, :pos], df1, df.iloc[:, pos 1:]], axis=1)
print (df)
name category_fe category_ft category_fx dummy
0 USA True True True 1
1 INDIA False False True 13
此解決方案針對多列進行了修改:
print (df)
name category dummy category1
0 USA fx,ft,fe 1 a,f
1 INDIA fx 13 s,a
cols = ['category','category1']
dfs = [(df[c].str.get_dummies(',').astype(bool).add_prefix(f'{c}_')) for c in cols]
df = pd.concat([df, *dfs], axis=1).drop(cols, axis=1)
print (df)
name dummy category_fe category_ft category_fx category1_a \
0 USA 1 True True True True
1 INDIA 13 False False True True
category1_f category1_s
0 True False
1 False True
uj5u.com熱心網友回復:
您可以使用str.get_dummiesandastype(bool)將字串轉換為新的布林值列,然后add_prefix更改列名,最后join:
df2 = (df.drop(columns='category)
.join(df['category']
.str.get_dummies(sep=',')
.astype(bool)
.add_prefix('category_')
)
)
或者,為了修改原始資料框:
df = df.join(df.pop('category')
.str.get_dummies(sep=',')
.astype(bool)
.add_prefix('category_'))
輸出:
name category_fe category_ft category_fx
0 USA True True True
1 INDIA False False True
泛化到更多列
假設這個輸入:
name category1 category2 dummy
0 USA fx,ft,fe a,b,c 1
1 INDIA fx d 13
cats = df.filter(like='category').columns
cols = list(df.columns.difference(cats))
(df
.set_index(cols)
.stack()
.str.get_dummies(sep=',')
.groupby(level=cols).max().astype(bool)
.reset_index()
)
輸出:
dummy name a b c d fe ft fx
0 1 USA True True True False True True True
1 13 INDIA False False False True False False True
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/478531.html
