You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中基于差值最小化标准差实现两组数据配对?

问题描述

我需要将两组数据配对,使得配对后的差值标准差最小。现有数据如下:

set1= (300, 420, 541, 600)
set2= (1470, 1250, 1250, 1360)

以下是三个配对示例:

示例#1

(300, 420, 541, 600)
(1250, 1250, 1360, 1470)

差值为(950, 830, 819, 870),标准差为59.35

示例#2

(300, 420, 541, 600)
(1470, 1250, 1360, 1250)

差值为(1170, 830, 819, 650),标准差为217.99

示例#3

(300, 420, 541, 600)
(1250, 1470, 1360, 1250)

差值为(950, 1050, 819, 650),标准差为127.98

其中示例#1的标准差最小,是理想配对结果。请问如何在Python中实现该配对逻辑?此前该操作在Access中完成。


更新1:数据以DataFrame形式传入

data1 = {'col1': ["A", "B", "C", "C"], 'col2': [300, 420, 541, 600]}
data2= {'col1': ["A", "C", "B", "D"], 'col2': [1470, 1250, 1250, 1360]}

需使用data1.col2和data2.col2作为set1和set2进行配对,期望得到如下结果:

data1  = {'col1': ["A", "B", "C", "C"], 'col2': [300, 420, 541, 600], 'col3': [1250, 1250, 1360, 1470]} 

新增col3填充来自最小标准差配对后的set2有序数据。


更新2:关联set2的col1信息

若想在最终的data1中加入set2的col1信息,基于最小标准差配对结果进行关联是否可行?


解决方案

核心逻辑

要让配对后差值的标准差最小,等价于让差值的方差最小。根据数学上的排序不等式:要使Σ(a_i - b_j)²最小,需让两组数据同序配对(即两组数据都按升序/降序排列后一一对应)。这是因为Σ(a_i - b_j)² = Σa_i² + Σb_j² - 2Σa_i b_j,当Σa_i b_j最大时(同序配对),整体值最小,对应方差/标准差最小。

针对DataFrame的实现步骤

1. 导入依赖并转换为DataFrame

import pandas as pd

data1 = {'col1': ["A", "B", "C", "C"], 'col2': [300, 420, 541, 600]}
data2 = {'col1': ["A", "C", "B", "D"], 'col2': [1470, 1250, 1250, 1360]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

2. 实现最小标准差配对

  • 对df1按col2升序排序,保留原始索引;
  • 对df2按col2升序排序;
  • 将排序后的df2['col2']按df1排序后的索引映射回原df1,生成col3:
# 对df1排序并记录原始位置
df1_sorted = df1.sort_values('col2').reset_index(drop=False)
# 对df2排序,提取col2
df2_sorted_col2 = df2.sort_values('col2')['col2'].reset_index(drop=True)
# 配对后映射回原df1
df1_sorted['col3'] = df2_sorted_col2
# 恢复原df1的顺序
df1_final = df1_sorted.sort_values('index').drop('index', axis=1).reset_index(drop=True)

print(df1_final)

输出结果:

col1  col2  col3
0    A   300  1250
1    B   420  1250
2    C   541  1360
3    C   600  1470

完全符合期望的结果。

3. 关联set2的col1信息

可行。只需在排序df2时保留col1,再将其映射回原df1即可:

# 对df2排序,保留col1和col2
df2_sorted = df2.sort_values('col2').reset_index(drop=True)
# 给排序后的df1添加col3(set2的col2)和col4(set2的col1)
df1_sorted['col3'] = df2_sorted['col2']
df1_sorted['col4'] = df2_sorted['col1']
# 恢复原顺序
df1_final_with_col1 = df1_sorted.sort_values('index').drop('index', axis=1).reset_index(drop=True)

print(df1_final_with_col1)

输出结果:

col1  col2  col3 col4
0    A   300  1250    C
1    B   420  1250    B
2    C   541  1360    D
3    C   600  1470    A

这样就成功将set2的col1信息关联到最终结果中。


内容的提问来源于stack exchange,提问作者Connie Xu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:25:16