合并数据框以包括指示行属于哪些数据帧的列

时间:2017-08-31 06:14:40

标签: python pandas dataframe

我有两个Dataframe(一个是hashable,b是unhashable)

   Foo              
    a   b           
A   1   2       
B   1   3       
C   0   4       

 Bar
a   b
A   1   2
D   0   6

如果索引或代码(在这种情况下为A,B,C,D)相同,则a和b必须相同。 我想知道如何合并这两个数据框,显示列所属的位置。

    a   b   Foo   Bar
A   1   2    1     1
B   1   3    1     0
C   0   4    1     0
D   0   6    0     1

获取此数据框的最有效方法是什么?

2 个答案:

答案 0 :(得分:2)

您应该可以使用df.merge

执行此操作
df1['Foo'] = 1
df2['Bar'] = 1
out = df1.merge(df2, on=['a', 'b'], how='outer').fillna(0).astype(int)

print(out)
   a  b  Foo  Bar
0  1  2    1    1
1  1  3    1    0
2  0  4    1    0
3  0  6    0    1

答案 1 :(得分:1)

如果assign的数据中没有NaNmerge的外部联接,则为一行解决方案。但是必须为index中的列添加reset_index,因为需要将索引合并到一起。最后set_indexrename_axis一起创建index

可以删除参数on,因为它们连接在两个DataFrame中的相同列上。

df = pd.merge(Foo.reset_index().assign(Foo=1), 
              Bar.reset_index().assign(Bar=1), how='outer') \
       .fillna(0) \
       .set_index('index') \
       .rename_axis(None) \
       .astype(int)
print (df)
   a  b  Foo  Bar
A  1  2    1    1
B  1  3    1    0
C  0  4    1    0
D  0  6    0    1

如果可能NaN s,则仅将子集用于指标列:

df = pd.merge(Foo.reset_index().assign(Foo=1), 
              Bar.reset_index().assign(Bar=1), how='outer') \
       .set_index('index') \
       .rename_axis(None) 
df[['Foo','Bar']] = df[['Foo','Bar']].fillna(0).astype(int)
print (df)
   a    b  Foo  Bar
A  1  NaN    1    1
B  1  3.0    1    0
C  0  4.0    1    0
D  0  6.0    0    1

pandas已通过参数indicator实现了类似的方式:

df = pd.merge(Foo.reset_index().assign(Foo=1), 
              Bar.reset_index().assign(Bar=1), how='outer', indicator='indicator') \
       .set_index('index') \
       .rename_axis(None) 
print (df)
   a  b  Foo  Bar   indicator
A  1  2  1.0  1.0        both
B  1  3  1.0  NaN   left_only
C  0  4  1.0  NaN   left_only
D  0  6  NaN  1.0  right_only