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

如何基于同DataFrame内行间多条件比较用Pandas创建新DataFrame?

Pandas同一DataFrame行间匹配解决方案

数据预处理

首先将start_time转换为datetime类型,否则无法计算时间差:

import pandas as pd

# 样本数据构造
df = pd.DataFrame({
    'Cosine_i_': [0.820108, 0.962301, 0.811369, 0.788322, 0.811369],
    'start_time': ['2022-08-31T10:48:34Z', '2022-08-27T12:25:06Z', '2022-08-19T15:39:39Z', '2023-01-29T13:23:39Z', '2022-08-19T15:39:39Z'],
    'fid_': ['emit20220831t104834_o24307_s000', 'emit20220827t122506_o23908_s000', 'emit20220819t153939_o23110_s000', 'emit20230129t132339_o02909_s000', 'emit20220819t153939_o23110_s000'],
    'Shape_Area': [0.067763, 0.067763, 0.404882, 0.404882, 0.108256]
})

# 转换时间列
df['start_time'] = pd.to_datetime(df['start_time'])

核心逻辑:分组自连接+条件筛选

针对大型数据集,避免低效的双重循环,采用分组后自连接的方式,批量处理同Shape_Area组内的行对匹配:

def process_shape_group(group):
    # 组内自连接,生成所有行对(suffixes区分左右表)
    pair_df = group.merge(group, on='Shape_Area', suffixes=('_left', '_right'))
    
    # 排除自身匹配和重复行对(如行A-行B与行B-行A只保留一组)
    pair_df = pair_df[pair_df.index_left < pair_df.index_right]
    
    # 应用三个筛选条件
    cosine_condition = abs(pair_df['Cosine_i__left'] - pair_df['Cosine_i__right']) > 0.1
    time_condition = abs(pair_df['start_time_left'] - pair_df['start_time_right']).dt.days > 5
    
    # 获取符合条件的行对
    valid_pairs = pair_df[cosine_condition & time_condition]
    
    # 提取所有涉及的fid_并去重
    valid_fids = pd.concat([valid_pairs['fid__left'], valid_pairs['fid__right']]).unique()
    
    # 返回组内符合条件的原始行
    return group[group['fid_'].isin(valid_fids)]

# 按Shape_Area分组处理,合并结果
result_df = df.groupby('Shape_Area', group_keys=False).apply(process_shape_group).reset_index(drop=True)

结果验证

执行代码后,result_df会输出符合所有条件的行:

Cosine_i_             start_time                           fid_  Shape_Area
0   0.811369 2022-08-19 15:39:39+00:00  emit20220819t153939_o23110_s000    0.404882
1   0.788322 2023-01-29 13:23:39+00:00  emit20230129t132339_o02909_s000    0.404882

大型数据集优化技巧

  • 索引优化:给Shape_Area列建立索引,加速分组操作:df = df.set_index('Shape_Area')(处理完成后可重置索引)。
  • 内存控制:若数据量过大,可使用dask.dataframe进行并行分块处理,避免内存溢出。
  • 预过滤:提前过滤掉不可能满足条件的行(如Cosine_i_差值范围小于0.1的组),减少计算量。
  • 避免重复计算:自连接时通过index_left < index_right避免重复行对,减少一半的计算量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:55:18