我有两个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
获取此数据框的最有效方法是什么?
答案 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
的数据中没有NaN
,merge
的外部联接,则为一行解决方案。但是必须为index
中的列添加reset_index
,因为需要将索引合并到一起。最后set_index
与rename_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