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

如何高效将满足条件的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:11:16