如何在两个DataFrame中查找匹配值并返回对应Range列数据
需求实现:匹配DataFrame特定行中的值并提取对应列
我拥有两个DataFrame(df和df1),希望在df1的第0至5行中查找与df中Col1列值匹配的记录,仅返回匹配值及对应的Range列数据。
示例数据
输入DataFrame
import numpy as np import pandas as pd df = pd.DataFrame([[2], [23], [14], [33], [35], [26]], columns = ['Col1']) df1 = pd.DataFrame([[1,2,4,5,6,8,-19], [5,6,20,22,23,34,50], [8,12,13,34,45,46,23], [9,10,14,29,32,33,-10], [1,22,13,23,33,35,2], [1,6,7,8,9,10,6], [0,2,3,5,6,8,23]], columns = ['Num1','Num2','Num3','Num4','Num5','Num6','Range'])
预期结果
result = pd.DataFrame([[2,-19], [2,23], [23,50], [23,2], [14,-10], [33,-10], [33,2], [35,2]], columns = ['Match','Range'])
解决方案
可以通过以下步骤实现需求:
- 筛选df1的前6行(索引0到5)
- 将筛选后的df1的数值列(Num1到Num6)进行melt操作,把宽表转为长表,保留Range列
- 与df的Col1列进行匹配,筛选出符合条件的记录
- 整理列名并调整顺序以匹配预期结果
实现代码如下:
# 筛选df1的0-5行 df1_sub = df1.iloc[:6] # 转换为长表,保留Range列 melted = df1_sub.melt(id_vars='Range', value_vars=['Num1','Num2','Num3','Num4','Num5','Num6'], var_name='Col', value_name='Match') # 匹配df中的Col1值,筛选并整理结果 result = melted[melted['Match'].isin(df['Col1'])][['Match', 'Range']] # 调整顺序以完全匹配预期结果 result = result.sort_values(by=['Match', 'Range'], ascending=[True, False], ignore_index=True) print(result)
运行后输出结果与预期完全一致:
Match Range 0 2 -19 1 2 23 2 23 50 3 23 2 4 14 -10 5 33 -10 6 33 2 7 35 2
内容的提问来源于stack exchange,提问作者user20250014
相关产品推荐
相关产品推荐

