Python 3中如何获取Pandas DataFrame区间内的所有值?
解决Pandas生成区间所有值的问题
没问题,针对你这个需求,我给你分几种方案——从简单易读的基础版,到适合1万+记录的高效版,甚至极端大数据量下的内存友好方案,你可以根据自己的场景选择:
先构造你的示例数据
先把你给出的DataFrame用代码还原出来:
import pandas as pd data = { 'min': [10186, 10197, 10199, 11144, 11656, 13500, 13979, 14445, 14448], 'max': [10186, 10197, 11142, 11654, 13498, 13977, 14442, 14446, 14449] } df = pd.DataFrame(data)
基础实现(适合小数据集)
如果你的单条记录区间不大,这个方法简单直观,用apply生成每行的数值序列,再用explode展开:
# 给每行生成min到max的所有值(包含边界) df['values'] = df.apply(lambda row: pd.Series(range(row['min'], row['max'] + 1)), axis=1) # 展开成单行单值的格式 result = df.explode('values').reset_index(drop=True)
缺点:逐行apply在1万条记录+大区间的场景下会很慢,而且会占用较多内存。
高效向量化实现(适合1万+记录)
用numpy的向量化操作替代逐行循环,速度会快很多,内存使用也更紧凑:
import numpy as np # 计算每个区间的长度(包含两端,所以是max - min + 1) lengths = df['max'] - df['min'] + 1 # 核心逻辑:重复每个min值对应次数,再加上0到length-1的偏移量 all_values = np.repeat(df['min'].values, lengths) + np.concatenate([np.arange(l) for l in lengths]) # 转成DataFrame格式(也可以直接用numpy数组) result_df = pd.DataFrame({'value': all_values})
优势:向量化操作是Pandas/numpy的性能最优实践,处理1万条记录完全不在话下。
保留原行信息的版本
如果你需要保留每条原始记录的min和max字段,只需要对原列做同样的重复操作:
expanded_df = pd.DataFrame({ 'original_min': np.repeat(df['min'].values, lengths), 'original_max': np.repeat(df['max'].values, lengths), 'value': all_values })
极端大数据量的内存友好方案
如果有些区间的范围特别大(比如max-min达到几万甚至更多),一次性生成所有值会撑爆内存,这时候可以用迭代器逐个生成值,边生成边处理(比如写入文件):
def generate_values(df): for _, row in df.iterrows(): # 遍历当前行的所有区间值 for val in range(row['min'], row['max'] + 1): yield (row['min'], row['max'], val) # 使用迭代器处理,不会一次性加载所有数据到内存 for item in generate_values(df): original_min, original_max, current_val = item # 这里可以写处理逻辑,比如写入CSV/数据库 # print(current_val)
内容的提问来源于stack exchange,提问作者Karan Gupta
相关产品推荐
相关产品推荐

