我有这个数据框:
column1 column2 column3 column4
0 A A D D
1 B B D D
2 C C B D
3 A D D A
我想将column1-column4中的类别作为新列添加到数据框,并用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代表所有出现。你能帮我吗:)
答案 0 :(得分:0)
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)