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

如何高效将DataFrame两列指定范围展开为多行(大数据场景)

嘿,针对你这种百万级别的Pandas数据展开区间的需求,我得优先给你推荐向量化的高效方案,毕竟300万行数据用逐行处理的方法会慢到让人崩溃😅。下面给你两个方案,优先选第一个:

最优性能方案:Numpy向量化处理

这个方案完全依赖Numpy的底层C实现,避免了Python层面的逐行循环,处理300万行数据的速度会快很多,内存占用也更可控。

步骤如下:

  1. 先把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)
  1. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:00:36