Python按列数值区间拆分DataFrame的无循环实现及存储方案咨询
问题解答
无循环拆分DataFrame的实现方式
直接使用Pandas内置的向量化操作即可完成,全程不需要手动写逐行判断的循环,实现非常优雅:
核心思路
先用pd.cut函数按照指定区间给ColB列打分组标签,再用groupby按标签分组,直接得到拆分后的子DataFrame。
代码实现
import pandas as pd # 构造示例数据 data = { 'Time': [1,2,3,4,5,6], 'ColA': [100,105,107,106,104,103], 'ColB': [1.1,3.2,7.7,2.4,5.2,6.9], 'ColC': [500,600,550,750,950,450] } df = pd.DataFrame(data) # 1、定义区间规则,和示例输出匹配的规则可写为bins=[1,3,5, float('inf')] # 如果需要固定步长2的连续区间,可写为bins = range(1, int(df['ColB'].max()) + 2, 2) bins = [1,3,5, float('inf')] # 2、给每行打区间标签,right=False表示区间左闭右开,即[1,3)、[3,5),可按需调整 df['bin_label'] = pd.cut(df['ColB'], bins=bins, right=False) # 3、拆分结果转列表,每个元素是对应区间的子DataFrame df_list = [group.drop('bin_label', axis=1).reset_index(drop=True) for _, group in df.groupby('bin_label', sort=True)] # 4、拆分结果转字典,key为区间标签,value为对应子DataFrame df_dict = {label: group.drop('bin_label', axis=1).reset_index(drop=True) for label, group in df.groupby('bin_label', sort=True)}
上述实现所有核心逻辑都由Pandas底层的C语言运算完成,性能远高于手动写逐行判断循环的实现。
大数据集下列表与字典存储的效率对比
- 内存占用:两种方式存储的子DataFrame默认都是源数据的视图,不会重复存储实际数据,唯一差异是字典需要额外存储区间标签作为key,整体内存开销差异极小。
- 访问效率:
- 如果后续需要按顺序遍历所有拆分后的子DataFrame,列表效率更高,不需要哈希计算,遍历速度更快。
- 如果后续需要根据区间值随机查询某个特定区间的子DataFrame,字典效率更高,可以O(1)时间命中目标,列表遍历查找的时间复杂度为O(n)。
- 选型建议:不需要按区间检索选列表,需要快速按区间查找选字典。
内容的提问来源于stack exchange,提问作者Iceberg_Slim
相关产品推荐
相关产品推荐

