我正在嘗試獲取資料被拆分為多列的變數的虛擬變數。
Input Data:
fruit_1 fruit_2 fruit_3 fruit_4 fruit_5
Index
person1 Apple NaN NaN NaN NaN
person2 Apple Banana Guava NaN NaN
person3 Guava NaN NaN NaN NaN
person4 Banana NaN NaN NaN NaN
person5 Apple Banana Guava Kiwi Mango
person6 Kiwi Mango NaN NaN NaN
Desired Output:
Apple Banana Guava Kiwi Mango
Index
person1 1 0 0 0 0
person2 1 1 1 0 0
person3 0 0 1 0 0
person4 0 1 0 0 0
person5 1 1 1 1 1
person6 0 0 0 1 1
在大多數方法中,我嘗試過 NaN/blank 會導致問題,因為每行中的值數可以是 1 到 5 之間的任何值。我正在使用熊貓來做到這一點。感謝您的幫助。
uj5u.com熱心網友回復:
使用get_dummies通過聚合所有列max由重復的列名:
df = pd.get_dummies(df, prefix='', prefix_sep='').groupby(level=0, axis=1).max()
print (df)
Apple Banana Guava Kiwi Mango
person1 1 0 0 0 0
person2 1 1 1 0 0
person3 0 0 1 0 0
person4 0 1 0 0 0
person5 1 1 1 1 1
person6 0 0 0 1 1
或者先按 重塑DataFrame.stack,然后max按索引聚合,第一級:
df = pd.get_dummies(df.stack()).groupby(level=0).max()
print (df)
Apple Banana Guava Kiwi Mango
person1 1 0 0 0 0
person2 1 1 1 0 0
person3 0 0 1 0 0
person4 0 1 0 0 0
person5 1 1 1 1 1
person6 0 0 0 1 1
uj5u.com熱心網友回復:
一種選擇是按value_counts行應用并填充任何空值
df.apply(pd.Series.value_counts, axis = 1).fillna(0, downcast='infer')
Apple Banana Guava Kiwi Mango
Index
person1 1 0 0 0 0
person2 1 1 1 0 0
person3 0 0 1 0 0
person4 0 1 0 0 0
person5 1 1 1 1 1
person6 0 0 0 1 1
你可以做一個交叉表,這需要轉換為長格式(上面的解決方案避免了一個步驟,希望能提供更高的效率):
box = df.melt(ignore_index = False)
pd.crosstab(box.index, box.value)
value Apple Banana Guava Kiwi Mango
row_0
person1 1 0 0 0 0
person2 1 1 1 0 0
person3 0 0 1 0 0
person4 0 1 0 0 0
person5 1 1 1 1 1
person6 0 0 0 1 1
請注意,交叉表并不是很快速,但非常方便。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/369913.html
