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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:10:24