如何高效将DataFrame两列指定范围展开为多行(大数据场景)
嘿,针对你这种百万级别的Pandas数据展开区间的需求,我得优先给你推荐向量化的高效方案,毕竟300万行数据用逐行处理的方法会慢到让人崩溃😅。下面给你两个方案,优先选第一个:
最优性能方案:Numpy向量化处理
这个方案完全依赖Numpy的底层C实现,避免了Python层面的逐行循环,处理300万行数据的速度会快很多,内存占用也更可控。
步骤如下:
- 先把
from和to列转为整数类型(如果原本是字符串的话):
import pandas as pd import numpy as np df = pd.DataFrame({'name':['L1', 'L2'], 'from':['1', '5'], 'to':['3', '7']}) df['from'] = df['from'].astype(int) df['to'] = df['to'].astype(int)
- 用Numpy的广播和拼接生成结果:
# 计算每个区间需要展开的行数 interval_lengths = df['to'] - df['from'] + 1 # 重复name列对应次数 expanded_names = np.repeat(df['name'].values, interval_lengths) # 批量生成所有区间内的数字 expanded_nums = np.concatenate([ np.arange(start, end + 1) for start, end in zip(df['from'], df['to']) ]) # 构建最终结果DataFrame result_df = pd.DataFrame({'name': expanded_names, 'n°': expanded_nums})
运行后得到的结果就是你想要的格式,而且哪怕是范围跨度到9000的情况,这个方法也能轻松处理。
简洁实现方案(适合中小数据,百万级也能跑但稍慢)
如果追求代码简洁,也可以用Pandas的apply+explode组合,但这个方法是逐行处理的,对于300万行数据来说,速度会比上面的Numpy方案慢不少:
df['from'] = df['from'].astype(int) df['to'] = df['to'].astype(int) result_df = ( df.assign(n°=df.apply(lambda row: pd.Series(range(row['from'], row['to']+1)), axis=1)) .explode('n°') .drop(columns=['from', 'to']) )
小提醒
不管用哪个方案,一定要先把from和to转成整数类型,不然生成区间的时候会报错哦!
内容的提问来源于stack exchange,提问作者Pijay
相关产品推荐
相关产品推荐

