将两个数据帧合并为一个新的,带有标记为1或0的唯一项

时间:2019-06-30 16:02:20

标签: python pandas dataframe

我有几个数据框。

数据帧#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,但是我不知道如何从那里得到上面给出的最终数据帧。有什么想法吗?

4 个答案:

答案 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)

您可以将mergeseries.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()这样的方法的优点是什么,如果您可以使用内置的方法/功能实现相同的效果?快很多吗? 真正好奇,因为我本人还是新手。

(对不起,我需要更多信誉点才能直接在其他答案下发表评论!)