Pandas DataFrame列值差值计算:求最小差值并关联原数据
Pandas:为df1每行计算与df2指定列所有值的差值最小值
核心需求
给df1的B列每个值,计算其与df2的D列所有值的差值,取最小值后添加到df1对应行。
示例数据
import pandas as pd data1 = [[0.1, 0.5], [0.11, 0.4]] df1 = pd.DataFrame(data1, columns=['A', 'B']) data2 = [[-0.6, 0.33], [0.47, 0.9],[0.21, 0.76], [-0.7, 0.01]] df2 = pd.DataFrame(data2, columns=['C', 'D'])
方法一:广播运算(高效适配大数据)
利用Numpy广播机制直接生成所有差值的二维数组,再逐行取最小值,性能远高于apply,适合你提到的10行+20行甚至更大规模的数据:
# 计算差值并取每行最小值,添加为新列 df1['min_diff'] = (df1['B'].values[:, None] - df2['D'].values).min(axis=1)
执行后df1结果:
| A | B | min_diff | |
|---|---|---|---|
| 0 | 0.10 | 0.50 | -0.40 |
| 1 | 0.11 | 0.40 | -0.50 |
方法二:apply方法(直观易读,小数据友好)
通过apply遍历df1['B']的每个值,逐次计算与df2['D']的差值最小值,代码更直观,适合小规模数据:
df1['min_diff'] = df1['B'].apply(lambda x: (x - df2['D']).min())
补充:取绝对值最小的差值(常见场景)
如果你的实际需求是找最接近的数值(即差值的绝对值最小),只需对差值取绝对值后再取最小值:
# 广播方式 df1['abs_min_diff'] = abs(df1['B'].values[:, None] - df2['D'].values).min(axis=1) # apply方式 df1['abs_min_diff'] = df1['B'].apply(lambda x: abs(x - df2['D']).min())
示例中abs_min_diff结果为[0.17, 0.07],对应0.5最接近0.33,0.4最接近0.33。
内容的提问来源于stack exchange,提问作者BTM
相关产品推荐
相关产品推荐

