如何在Pandas中抽取20000组满足value差限制的连续行配对样本
解决方案
因为你的DataFrame已经按value列排序,我们可以先筛选出所有满足「相邻行value差值≤4000」的连续行对,再从中随机抽取20000组,最后计算所需的差值。以下是具体实现步骤:
步骤1:筛选符合条件的连续行对起始索引
首先计算每行与下一行的value差值,筛选出差值不超过4000的行(这些行可以作为配对的第一行):
import pandas as pd import numpy as np # 假设你的DataFrame名为df,且已按value排序 # 计算下一行与当前行的value差值(shift(-1)实现错位对齐) value_diff = df['value'].diff().shift(-1) # 筛选出差值≤4000的行索引(自动排除最后一行,因为它没有下一行) valid_start_indices = df.index[value_diff <= 4000]
步骤2:随机抽取20000组符合条件的起始索引
从筛选后的有效起始索引中随机选择20000个(确保不重复抽取):
# 随机选择20000个起始索引,replace=False表示不重复选取同一组 selected_starts = np.random.choice(valid_start_indices, size=20000, replace=False)
步骤3:提取配对行并计算差值
使用向量化操作高效提取配对行并计算差值(比循环更适合大数据量场景):
# 获取选中起始索引在DataFrame中的位置(对应iloc的索引位置) start_positions = df.index.get_indexer(selected_starts) end_positions = start_positions + 1 # 对应的下一行位置 # 提取配对的两行数据,添加后缀区分每组的第一行和第二行 pair_first = df.iloc[start_positions].add_suffix('_1').reset_index(names='index_1') pair_second = df.iloc[end_positions].add_suffix('_2').reset_index(names='index_2') # 合并两行数据并计算差值 final_result = pd.concat([pair_first, pair_second], axis=1) final_result['value_diff'] = final_result['value_2'] - final_result['value_1'] final_result['distance_diff'] = final_result['distance_2'] - final_result['distance_1'] # 添加配对ID便于区分各组 final_result['pair_id'] = range(1, len(final_result)+1)
结果说明
final_result会包含每组配对的所有原始列(带_1/_2后缀),以及计算出的value_diff和distance_diff,总计20000组配对。如果需要保留原始的40000行形式(每组占两行),可以用以下代码重塑:
# 重塑为每组两行的格式 long_format = final_result.melt( id_vars=['pair_id'], var_name='col_info', value_name='value' ).assign( col=lambda x: x['col_info'].str.split('_').str[0], pair_part=lambda x: x['col_info'].str.split('_').str[1] ).pivot( index=['pair_id', 'pair_part'], columns='col', values='value' ).reset_index()
内容的提问来源于stack exchange,提问作者MonteCristo
相关产品推荐
相关产品推荐

