为了账号安全,请及时绑定邮箱和手机立即绑定

Python:值转换为列和标志

Python:值转换为列和标志

慕容708150 2023-05-23 10:39:21
是否有任何方法可以使用 python 代码将值转换为列名并将它们标记为 1 或 0,如下面的示例所示?hobbytable 在爱好列中有值,但有些单元格有多个值,用“/”分隔。为了使用多元回归模型或其他模型,数据集的形状会更好,低于预期结果。共享示例代码以解决此问题将不胜感激。爱好表(CSV 文件)personID, hobbyx1234, baseball/soccery1234, reading/baseballz1234, nulla1234, soccer作为 DataFrame 的预期结果personID, baseball, soccer, reading, soccerx1234, 1, 1, 0, 0y1234, 1, 0, 1, 0z1234, 0, 0, 0, 0a1234, 0, 1, 0, 0
查看完整描述

3 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

你可以试试这个:


import pandas as pd


df1 = pd.read_csv(fileName, sep=",")

df2 = df1["hobby"].str.get_dummies("/")

df = pd.concat([df1, df2], axis = 1)

print(df)

输出:


  personID             hobby  baseball  reading  soccer

0    x1234   baseball/soccer         1        0       1

1    y1234  reading/baseball         1        1       0

2    z1234               NaN         0        0       0

3    a1234            soccer         0        0       1


查看完整回答
反对 回复 2023-05-23
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

让我们尝试pandas.get_dummies标记值和groupby索引以减少数据帧。使用列索引连接pandas.concat创建。dummiesoriginal dataframe


import pandas as pd


dummies = (

    pd.get_dummies(df.hoppy.str.split("/").explode())

        .groupby(level=0).sum()

)

print(pd.concat([df, dummies], axis = 1))

personID             hoppy  baseball  reading  soccer

0    x1234   baseball/soccer         1        0       1

1    y1234  reading/baseball         1        1       0

2    z1234               NaN         0        0       0

3    a1234            soccer         0        0       1




查看完整回答
反对 回复 2023-05-23
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

您可以一行完成:

df = df.assign(val=1).pivot_table(values='val', index='personID,', columns='hoppy').fillna(0)

解释:

.assign()添加一列,这里我们用你稍后在输出表中看到的 1 填充它

.pivot_table()现在旋转表 essentialy 为您完成主要工作,如果找不到列的 persionID,它将具有“nan”值

.fillna()因此用于用 0 填充此“nan”值


查看完整回答
反对 回复 2023-05-23
  • 3 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信