如何按指定标识行[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]
解决方案
不需要逐行遍历,可通过生成分组标识的方式高效实现拆分,步骤如下:
- 定位标识行:筛选出所有等于
[99,99]的行 - 生成分组键:为每一行分配对应组号,同一组的行从起始到对应
[99,99]行共享组号 - 分组拆分:用
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
相关产品推荐
相关产品推荐

