python - 如何将分隔值转换为one-hot编码列?

标签 python python-3.x pandas dataframe

所以我的数据框看起来像这样,其中有食物选择和用户 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/

相关文章:

python - 如何使用我的 eureka 服务器注册 python 微服务(spring boot)

python - Pygame Collidepoint 函数未按预期工作

python - docker容器内的SSH key

Python:如何使用循环导入调用另一个文件中的函数

python - 模块 'scipy.special' 在 Python/SciPy 中没有 'expit' 成员

python - 了解每个用户的位置时间 : using the shift function

python - pd dataframe 按 id 添加行

python - 在python中高效读取和验证csv文件

python - 将 python 脚本转换为使用 lxml 的 etree 模块的 linux 二进制文件的问题

Python dataframes - 如何在此处应用线程/多重处理来加快速度