我有这个数据框:

    column1   column2   column3   column4
0     A          A         D         D
1     B          B         D         D
2     C          C         B         D
3     A          D         D         A


我想将columns1-columns4中的类别作为新列添加到数据框,并用1和0填充它,如下所示:

    column1   column2   column3   column4   A     B     C     D
0     A          A         D         D      1     0     0     1
1     B          B         D         D      0     1     0     1
2     C          C         B         D      0     1     1     1
3     A          D         D         A      1     0     0     1


所以我尝试了一些代码:

pd.concat([df, df['column1'].str.get_dummies(sep=',')], axis=1)


我从列1得到1和0。如何修改我的代码以获取所有1和0
条件是:

0 & 0 = 0
0 & 1 = 1
1 & 0 = 1
1 & 1 = 1


我也尝试过:

df1 = df.column1.str.get_dummies(sep=',')
df2 = df.column2.str.get_dummies(sep=',')
df3 = df.column3.str.get_dummies(sep=',')
df4 = df.column4.str.get_dummies(sep=',')
frames = [df1, df2, df3, df4]
result = pd.concat(frames, sort=True)


但是我希望类别作为新列仅出现一次,并且值1代表所有出现。你能帮我么 :)

最佳答案

get_dummies方法根据系列的值计算类别的数量,因此需要从中提取虚拟变量的系列的值(在本例中为列)包含要获取的所有类别,换句话说,您必须拥有一列,其中所有4列的值都用分隔符连接在一起。为了将所有值放在一起,我们使用:

new_col = df[['column1', 'column2', 'column3', 'column4']].apply(lambda x: '|'.join(x), axis=1)


它基本上将所有列值都用“ |”连接到单个字符串中分隔符按行获取此系列:

0    A|A|D|D
1    B|B|D|D
2    C|C|B|D
3    A|D|D|A


现在我们仅将get_dummies(sep='|')方法应用于上一列,以获取考虑到这些列中存在的所有类别的虚拟变量,可以在一行代码中将其获取为(我也将其与原始数据集按顺序合并)获取您要求的格式):

df = pd.concat([df, df[['column1', 'column2', 'column3', 'column4']]
       .apply(lambda x: '|'.join(x), axis=1)
       .str
       .get_dummies(sep='|')], axis=1)

关于python - 如何使用get_dummies从现有列创建新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54451491/

10-12 23:09