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

如何按指定标识行[99,99]拆分不同大小的Pandas DataFrame

按特定标识行拆分Pandas DataFrame

需求:将合并后的Pandas DataFrame按末尾的标识行[99,99]拆分为多个原始分组DataFrame。设备采集的两列数据会追加到.txt文件,每组数据末尾固定添加[99,99]行,需要还原原始分组。尝试过groupby方法但无效,询问是否需要遍历查找标识行实现拆分。

初始DataFrame示例

import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8], [99, 99], 
                   [0, 5], [9, 8], [1, 2], [3, 4], [7, 3], [99, 99], 
                   [0.5, 0.4], [0, 0], [99, 99], [-100, -100], [99, 99]])

期望拆分结果

拆分后得到多个独立的DataFrame:

  • df1:包含行[1,2], [3,4], [5,6], [7,8], [99,99]
  • df2:包含行[0,5], [9,8], [1,2], [3,4], [7,3], [99,99]
  • df3:包含行[0.5,0.4], [0,0], [99,99]
  • df4:包含行[-100,-100], [99,99]

解决方案

不需要逐行遍历,可通过生成分组标识的方式高效实现拆分,步骤如下:

  1. 定位标识行:筛选出所有等于[99,99]的行
  2. 生成分组键:为每一行分配对应组号,同一组的行从起始到对应[99,99]行共享组号
  3. 分组拆分:用groupby按组号拆分,得到各分组DataFrame

代码实现

import pandas as pd

# 初始DataFrame
df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8], [99, 99], 
                   [0, 5], [9, 8], [1, 2], [3, 4], [7, 3], [99, 99], 
                   [0.5, 0.4], [0, 0], [99, 99], [-100, -100], [99, 99]])

# 1. 生成标识行的布尔掩码
mask = (df[0] == 99) & (df[1] == 99)

# 2. 生成分组键:每遇到一个标识行,组号递增
group_ids = mask.cumsum()

# 3. 按组号拆分并转为DataFrame列表
df_list = [group for _, group in df.groupby(group_ids)]

# 输出验证结果
for i, df_group in enumerate(df_list, 1):
    print(f"df{i}:")
    print(df_group)
    print("---")

代码说明

  • mask:通过布尔索引精准筛选所有[99,99]的行,返回布尔类型Series
  • group_ids:利用cumsum()对mask累加,每遇到标识行(True)组号自动加1,确保同一组内的行拥有相同组号
  • df_list:groupby按组号拆分后,将每个分组转为列表元素,每个元素即为独立的目标DataFrame

这种方法效率远高于逐行遍历,适配大型数据集,同时完美还原原始分组结构。

内容的提问来源于stack exchange,提问作者wallydog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:35:19