如何查找两个数据框中匹配行的索引

2 投票
3 回答
60 浏览
提问于 2025-04-13 15:58

我有两个数据表,它们有一列部分匹配:

data_a = ['a', 'b', 'c', 'd', 'e', 'f']
data_b = ['b', 'd', 'f', 'h']
df1 = pd.DataFrame(data_a, columns=['data'])
df2 = pd.DataFrame(data_b, columns=['data'])

我想找出在 df2 中的数据和 df1 中的数据的索引匹配情况。就像这样:

indices = [1, 3, 5, None]

比如 df2 的第0行和 df1 的第1行匹配,df2 的第1行和 df1 的第3行匹配,等等……

如果没有匹配的情况,那么这个值就是 None 或者任何负数。
可以假设每个值在数据列中都是唯一的,所以每个值只会有一个匹配。

我可以用循环来做这个,但这样速度比较慢。
我在寻找更高效的方法来实现这个,或者类似的方式。

3 个回答

1
df = df2.merge(df1.reset_index(), on='data', how='left')[["index"]]
df

输出结果是:

    index
0   1.0
1   3.0
2   5.0
3   NaN

接下来,应用:

indices = df.astype('Int64').replace({pd.NA: None})['index'].tolist()
indices

就得到了想要的列表:

[1, 3, 5, None]
2

使用reset_index,然后进行左连接merge

df2.merge(df1.reset_index(), on='data', how='left')

输出结果:

  data  index
0    b    1.0
1    d    3.0
2    f    5.0
3    h    NaN

注意,如果你有多个匹配项,这样会生成额外的行:

data_a = ['a', 'b', 'c', 'd', 'b', 'f']
data_b = ['b', 'd', 'f', 'h']
df1 = pd.DataFrame(data_a, columns=['data'])
df2 = pd.DataFrame(data_b, columns=['data'])
out = df2.merge(df1.reset_index(), on='data', how='left')

  data  index
0    b    1.0
1    b    4.0
2    d    3.0
3    f    5.0
4    h    NaN
3

只要df1里的值是唯一的并且可以被哈希,就应该可以正常工作——

>>> s1 = df1['data']
>>> s2 = df2['data']

>>> s3 = pd.Series(data=s1.index, index=s1)
>>> s3
data
a    0
b    1
c    2
d    3
e    4
f    5
dtype: int64

>>> s2.map(s3)
0    1.0
1    3.0
2    5.0
3    NaN
Name: data, dtype: float64

>>> s2.map(s3).fillna(-1).astype(int).to_list()
[1, 3, 5, -1]

撰写回答