所以我的数据框看起来像这样,其中有食物选择和用户 ID 作为列:
Food choices
1 0 Pizza | Hamburger
2 1 Sushi | Pizza | Pasta | Steak | Noodles
3 2
4 3 French Fries | Hot dogs | Prawns
5 4 Bacon | Meatballs
6 5 Mozeralla Sticks
我想将它们分成这样的:
User_ID, Pizza, Hamburger, Sushi, Pasta, ...
1, True, True, False, False, ...
2, True, False, True, True, ...
我将它们分成:
df['Food Choices'].fillna('None').apply(lambda x: pd.Series(x.split('|'))).fillna('None').replace('None',np.nan)
现在我确实将它们放在单独的列中,但我正在努力解决如何标记值的存在/不存在。 我的想法是分离出每个值并将每个值与数据帧进行比较:
lst = list(pd.unique(df['Food choices'].fillna('None').apply(lambda x: pd.Series(x.split('|'))).fillna('None').values.ravel('K')))
temp = df['Food choices'].fillna('None').apply(lambda x: pd.Series(x.split('|'))).fillna('None')
dfs = pd.DataFrame(columns = lst,
index = temp.index)
for val in lst:
for idx in temp.index:
dfs.loc[idx, val] = (temp.loc[idx] == val).any()
太丑了而且太慢了!所以我想也许我错过了一些可以在这方面帮助我的功能。 pd.get_dummies()
没有帮助。任何如何改善这种情况的建议都会非常有帮助。
最佳答案
尝试使用str.get_dummies
s = df['Food choices'].str.replace(' \| ','|').str.strip().str.lower().str.get_dummies('|')
df = df.join(s)
由于它们出现的顺序是随机的,有时空格会在分隔符旁边,有时则不会,这会导致列名加倍,一个带空格,一个不带空格。这在任何情况下都会有所帮助。
关于python - 如何将分隔值转换为one-hot编码列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64868507/