如何高效将满足条件的Pandas DataFrame拆分为多个子DataFrame?
高效拆分DataFrame中连续满足条件的块为子DataFrame
嘿,我懂你手动遍历找索引拆分的痛苦——数据量一大,那效率简直没法看!其实用pandas的向量化分组操作就能完美解决这个问题,比你现在的方法快得多,而且代码还更简洁。
核心思路
利用pandas的cumsum()生成连续满足条件块的分组标识,再通过groupby()直接拆分,全程都是pandas底层优化的向量化操作,避免了Python级别的循环。
具体实现步骤
假设我们有一个示例DataFrame df,我们要拆分其中连续满足condition条件的行块:
1. 先构造示例数据(方便你测试)
import pandas as pd import numpy as np np.random.seed(42) # 固定随机种子,保证结果可复现 df = pd.DataFrame({ 'value': np.random.randn(20), 'condition': np.random.choice([True, False], 20, p=[0.6, 0.4]) })
2. 生成连续块的分组ID
我们通过对不满足条件的行做累加,这样连续满足条件的行就会被分到同一个组里:
# 给连续的满足条件的行分配唯一组ID df['group_id'] = (~df['condition']).cumsum()
3. 筛选+分组,得到子DataFrame集合
先过滤出满足条件的行,再按group_id分组,最后转成字典(推荐用字典管理子DataFrame,比单独变量更易维护):
# 只保留满足条件的行,然后按组ID分组 valid_groups = df[df['condition']].groupby('group_id') # 把分组结果转成字典,键为df_1、df_2...,值为对应的子DataFrame sub_dfs = {f'df_{i+1}': group.drop(columns='group_id') for i, (_, group) in enumerate(valid_groups)}
如果你确实需要单独的变量(比如df_1、df_2这种),可以用globals()动态创建,但不推荐数据量大时这么做:
# 动态创建单独的子DataFrame变量 for idx, (_, group) in enumerate(valid_groups): globals()[f'df_{idx+1}'] = group.drop(columns='group_id')
适配自定义条件
如果你的条件不是单独的列,而是一个表达式(比如value > 0),直接把表达式代入即可:
# 自定义条件:value列大于0 condition = df['value'] > 0 df['group_id'] = (~condition).cumsum() valid_groups = df[condition].groupby('group_id')
为什么这个方法更高效?
手动遍历索引是Python级别的循环,速度慢;而cumsum()和groupby()都是pandas基于C语言实现的向量化操作,能充分利用底层优化,处理十万甚至百万级数据时,效率差距会非常明显。
内容的提问来源于stack exchange,提问作者S.B.G
相关产品推荐
相关产品推荐

