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

Pandas DataFrame跨行记录比较计算的高效优化方法

问题描述

给定如下测试DataFrame:

import pandas as pd
import numpy as np
df = pd.DataFrame(zip(*[np.random.randint(10, 25, size=100), 
                        np.random.randint(10, 25, size=100), 
                        np.random.randint(10, 25, size=100),
                        np.random.randint(10, 25, size=100)]), 
                  columns=list('ABCD'))

需要实现的计算逻辑:逐行统计满足以下两个条件的记录总数,作为test列的取值:

  • 当前行A列值 > 对比行A列值 + 3
  • 当前行B列值 < 对比行B列值 / 2

原有可运行的实现代码如下,但数据量超过10万行时运行耗时极长:

dd = df.to_dict(orient='index')

for k,v in dd.items():
    v['test'] = len([z['A'] for y,z in dd.items() 
                     if v['A'] > z['A']+3 
                     if v['B'] < z['B']/2])
    
result = pd.DataFrame.from_dict(dd,orient='index')
原代码性能瓶颈

原代码用了纯Python层面的O(n²)双重循环:每处理1行就要遍历全表所有行做条件判断,10万行数据需要执行100亿次分支判断,Python解释器执行这类循环的效率极低,耗时会达到小时级。

高性能实现方案

方案1:numpy向量化广播(10万行规模最优,秒级出结果)

把循环逻辑全部交给numpy在C层面执行,避免Python解释器的循环开销,性能比原实现提升1000倍以上,计算结果和原逻辑完全一致:

a = df['A'].to_numpy()
b = df['B'].to_numpy()
# 利用广播机制批量生成n*n的条件判断矩阵,直接按行求和得到统计值
cond_matrix = (a[:, None] > a + 3) & (b[:, None] < b / 2)
df['test'] = cond_matrix.sum(axis=1)

方案2:排序+二分优化(百万行以上规模适用,无内存溢出问题)

方案1的n*n布尔矩阵在数据量达到百万级时会占用TB级内存,无法直接运行。这种场景可以先按A列排序,用二分查找缩小每一行的统计范围,把内存占用降低几个数量级:

# 保留原始索引用于最后结果对齐
df = df.reset_index(drop=False).rename(columns={'index':'orig_idx'})
# 按A列升序排序
sorted_df = df.sort_values('A').reset_index(drop=True)
a_sorted = sorted_df['A'].to_numpy()
b_sorted = sorted_df['B'].to_numpy()

test_col = np.zeros(len(df), dtype=np.int64)
for i in range(len(sorted_df)):
    # 二分找到所有满足A < 当前行A-3的边界位置,无需遍历全量A列
    bound = np.searchsorted(a_sorted, a_sorted[i] - 3, side='left')
    if bound == 0:
        test_col[i] = 0
        continue
    # 仅统计边界范围内满足B列条件的行数
    test_col[i] = (b_sorted[:bound] > 2 * b_sorted[i]).sum()

# 映射回原始行顺序
sorted_df['test'] = test_col
result = sorted_df.sort_values('orig_idx').drop(columns='orig_idx').reset_index(drop=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 02:46:12