如何基于pandas DataFrame中特定ID的取值变化拆分对应分段数据集
解决方案
实现思路
- 先定位数据集中所有ID为
B的行,筛选出其中value取值发生变化的行索引,这些位置就是数据集的拆分节点 - 以拆分节点为边界,依次截取从当前节点到下一个拆分节点前的所有行,即为所需的子数据集
实现代码
import pandas as pd # 构造输入数据 data = {'ID': ['B', 'A', 'C', 'D', 'B','A','D'], 'value': ["status 1",125, "status1", 450, "status 2", 20 , 30], 'timestamp': [1632733508, 1632733508, 1632733511, 1632733512, 1632733513, 1632733515, 1632733518] } df1 = pd.DataFrame(data) # 获取B的取值发生变化的索引作为拆分点,末尾补数据集长度作为最后一个分片的结束边界 b_rows = df1[df1['ID'] == 'B'] split_points = b_rows.index[b_rows['value'] != b_rows['value'].shift(fill_value=object())].tolist() + [len(df1)] # 拆分得到子数据集列表 sub_dfs = [] for i in range(len(split_points)-1): # 如需重置子数据集的索引为从0开始,可在iloc后加 .reset_index(drop=True) sub_df = df1.iloc[split_points[i]:split_points[i+1]] sub_dfs.append(sub_df) # 输出查看结果 for idx, df in enumerate(sub_dfs, 1): print(f"第{idx}个子数据集:") print(df, '\n')
运行结果
第1个子数据集: ID value timestamp 0 B status 1 1632733508 1 A 125 1632733508 2 C status1 1632733511 3 D 450 1632733512 第2个子数据集: ID value timestamp 4 B status 2 1632733513 5 A 20 1632733515 6 D 30 1632733518
内容的提问来源于stack exchange,提问作者Horseman
相关产品推荐
相关产品推荐

