如何查找两个数据框中匹配行的索引
我有两个数据表,它们有一列部分匹配:
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]