如何在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
相关产品推荐
相关产品推荐

