我有几个数据框。
数据帧#1
Feature Coeff
a 0.5
b 0.3
c 0.35
d 0.2
数据帧#2
Feature Coeff
a 0.7
b 0.2
y 0.75
x 0.1
我要合并此数据框并获取以下数据:
Feature | DF1 | DF2
a 1 1
b 1 1
c 1 0
d 1 0
y 0 1
x 0 1
我知道我可以做一个outer
merge
,但是我不知道如何从那里得到上面给出的最终数据帧。有什么想法吗?
答案 0 :(得分:11)
使用concat
+ get_dummies
u = pd.concat([df1, df2], axis=0, keys=['DF1', 'DF2'])
pd.get_dummies(u.Feature).sum(level=0).T
DF1 DF2
a 1 1
b 1 1
c 1 0
d 1 0
x 0 1
y 0 1
答案 1 :(得分:6)
您可以将merge
与series.str.get_dummies()
一起使用以实现此目的:
d={'both':'DF1,DF2','left_only':'DF1','right_only':'DF2'}
m=m.assign(_merge=m._merge.map(d))
m[['Feature']].join(m._merge.str.get_dummies(','))
Feature DF1 DF2
0 a 1 1
1 b 1 1
2 c 1 0
3 d 1 0
4 y 0 1
5 x 0 1
{{1}}
答案 2 :(得分:4)
与user3483203类似的想法,但带有crosstab
u = pd.concat([df1, df2], axis=0, keys=['DF1', 'DF2'])
pd.crosstab(u.Feature, u.index.get_level_values(0))
答案 3 :(得分:2)
我使用pd.merge
合并了两个数据帧,并使用列表推导分配了值。
df = df1.merge(df2, on='Feature', how='outer')
df['DF1'] = [1 if x > 0 else 0 for x in df['Coeff_x']]
df['DF2'] = [1 if x > 0 else 0 for x in df['Coeff_y']]
df.drop(['Coeff_x', 'Coeff_y'], axis=1, inplace=True)
Feature DF1 DF2
0 a 1 1
1 b 1 1
2 c 1 0
3 d 1 0
4 y 0 1
5 x 0 1
我看到了其他(特定于熊猫)的答案,我想问一下series.str.get_dummies()
这样的方法的优点是什么,如果您可以使用内置的方法/功能实现相同的效果?快很多吗?
真正好奇,因为我本人还是新手。
(对不起,我需要更多信誉点才能直接在其他答案下发表评论!)