如何通过重叠的列和索引将两个数据框合并?

6
假设我有两个数据框,它们的列和索引名称有重叠,看起来像这样:
  A B C D
A 0 1 0 1
B 0 1 1 0
C 1 0 1 0
D 0 0 0 1

  A C D E
A 1 0 0 0
B 0 1 0 0
D 0 0 0 0
E 1 0 0 1

我希望将这两个数据框合并成一个,使得具有相同列名和索引名称的单元格被合并。最终结果应如下所示:

  A B C D E
A 1 1 0 1 0
B 0 1 1 0 0
C 1 0 1 0 0
D 0 0 0 1 0
E 1 0 0 0 1

我尝试使用Pandas.concat方法,但它只沿一个轴连接。

2个回答

22

alignnp.maximum

  • pandas.DataFrame.align函数会生成调用DataFrame和参数DataFrame的副本,并将它们的indexcolumn属性对齐,返回一个由两个DataFrame组成的元组。
  • 将这两个DataFrame传递给numpy.maximum函数,它能方便地识别这些对象为pandas.DataFrame类型,并返回一个新的DataFrame,其中包含了最大值。

np.maximum(*df1.align(df2, fill_value=0))

   A  B  C  D  E
A  1  1  0  1  0
B  0  1  1  0  0
C  1  0  1  0  0
D  0  0  0  1  0
E  1  0  0  0  1

6

你觉得怎样:

(df1.add(df2, fill_value=0)
    .fillna(0)
    .gt(0)
    .astype(int))

输出:

    A   B   C   D   E
A   1   1   0   1   0
B   0   1   1   0   0
C   1   0   1   0   0
D   0   0   0   1   0
E   1   0   0   0   1

看起来代码运行成功了,谢谢!如果您不介意回答的话,我有几个后续问题。当添加函数和连接函数都使用输入字段时,它们在搜索行/列方面的行为有何不同?此外,在这种情况下,gt函数的重要性是什么? - Ethan Li
1
我不知道第一个问题的答案。我猜它等同于这样做:pd.concat((df1,df2), sort=False).groupby(level=0).sum()。对于gt(0)的作用,总和返回int值,你希望它们是10(在B行,C列),所以1+1 = 2 -> 1 - Quang Hoang
我明白了,谢谢。据我理解,在这种情况下,gt(0)和replace(>1,1)的作用是相同的。对我来说,pandas文档页面上关于gt的说明并不是很清楚。 - Ethan Li
是的,gt(0) 检查每个值是否大于 0。同样,还有 geltleeqne。你能猜出它们的含义吗 :-) - Quang Hoang
@QuangHoang 不需要使用 fillna(0),因为你已经检查了是否 > 0。这也适用于 np.nan 的情况。所以可以使用 df1.add(df2, fill_value=0).gt(0).astype(int) - piRSquared

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接