如何遍历df1的day列在df2中查找最近2个值并添加至df1新列
实现DataFrame间最近值匹配并扩展列
需求说明
遍历df1的day列每个值,在df2中查找与之最接近的2个值,将对应day和rate分别存入df1的新列day1、day2、rate1、rate2。
数据准备
创建df1:
import numpy as np import pandas as pd data1 = np.array([(1, 150), (2, 250), (3, 350), (4, 590)]) df1 = pd.DataFrame(data1, columns=['n', 'day'])
df1内容:
n day 0 1 150 1 2 250 2 3 350 3 4 590
创建df2:
data2 = np.array([(120, 10.5), (180, 10.7), (350, 11.2), (620, 15.5)]) df2 = pd.DataFrame(data2, columns=['day', 'rate'])
df2内容:
day rate 0 120 10.5 1 180 10.7 2 350 11.2 3 620 15.5
已实现的单值查找函数
用于查找单个值在df2中最接近的2个记录:
# 查找最接近的n个值 def find_rates(df, s, x, n=2): diff = (s - x).abs() return df.loc[diff.nsmallest(n).index].sort_index()
示例调用:
find_rates(df2, df2.day, 150, n=2)
返回结果:
day rate 0 120.0 10.5 1 180.0 10.7
批量处理实现
通过apply遍历df1的day列,将每个值的匹配结果展开为对应列,再合并到原DataFrame:
# 处理单个day值,返回展开后的day1、day2、rate1、rate2 def process_day(x): res = find_rates(df2, df2.day, x) return pd.Series([ res.iloc[0]['day'], res.iloc[1]['day'], res.iloc[0]['rate'], res.iloc[1]['rate'] ]) # 应用函数并合并列 result = pd.concat([df1, df1['day'].apply(process_day)], axis=1) # 重命名新列 result.columns = ['n', 'day', 'day1', 'day2', 'rate1', 'rate2']
最终结果
print(result)
输出:
n day day1 day2 rate1 rate2 0 1.0 150.0 120.0 180.0 10.5 10.7 1 2.0 250.0 180.0 350.0 10.7 11.2 2 3.0 350.0 180.0 350.0 10.7 11.2 3 4.0 590.0 350.0 620.0 11.2 15.5
内容的提问来源于stack exchange,提问作者Jorge Dias
相关产品推荐
相关产品推荐

