如果assign 的数据中没有NaN 并且merge 的外部联接,则为一行解决方案。但是有必要为来自index 的列添加reset_index,因为需要将列与索引合并在一起。最后set_index 和rename_axis 用于创建index 返回。
参数on 可以删除,因为在两个DataFrames 中加入了相同的列。
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
如果可能 NaNs 则仅对指标列使用子集:
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