如何基于列值变化自动拆分Pandas DataFrame为子DataFrame?
解决方案
核心思路是通过检测列的变化规律,自动识别阶段分界点,再拆分出仅单列变化的子DataFrame,无需预先指定任何阶段信息。
实现步骤与代码
- 构造示例数据(可替换为你的真实DataFrame)
import pandas as pd # 模拟你的数据结构 data = { 'A': [0.5, 1.0, 1.5, 2.0, 2.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5], 'B': [10, 10, 10, 10, 10, 8, 9, 10, 11, 12, 10, 10, 10, 10, 10], 'C': [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 60, 80, 100, 120, 140] } df = pd.DataFrame(data)
- 自动识别阶段分界点
通过计算每列的差分,统计每行变化的列数,阶段切换时会有多列同时变化(比如从A列变化阶段切换到B列变化阶段,A列回归基线、B列开始变化,这一行会有2列变化),以此定位分界点:
# 标记每列每行是否发生变化 change_mask = df.diff().ne(0) # 统计每行变化的列数 change_count = change_mask.sum(axis=1) # 提取阶段切换点,补充起始和结束索引 split_indices = change_count[change_count > 1].index.tolist() split_indices.insert(0, 0) split_indices.append(len(df))
- 拆分并生成子DataFrame
遍历每个区间,检查区间内哪一列是唯一变化的列,将该区间存入对应名称的子DataFrame:
sub_dfs = {} for i in range(len(split_indices) - 1): start_idx = split_indices[i] end_idx = split_indices[i + 1] current_sub = df.iloc[start_idx:end_idx] # 找出区间内唯一变化的列 non_constant_cols = [col for col in df.columns if current_sub[col].nunique() > 1] if len(non_constant_cols) == 1: col_name = non_constant_cols[0] sub_dfs[f'dataframe{col_name}'] = current_sub else: # 处理异常情况:区间内多列变化或无变化 print(f"注意:区间[{start_idx}:{end_idx}]不符合单列变化规则,跳过") # 验证结果 print("拆分后的子DataFrame:") for name, sub_df in sub_dfs.items(): print(f"\n{name}:") print(sub_df)
原理说明
diff().ne(0):计算每列相邻行的差值,标记是否发生变化;- 阶段切换时,会有≥2列同时变化(之前变化的列回归恒定,新的列开始变化),通过统计变化列数定位分界点;
- 对每个区间,通过
nunique()判断列是否恒定,确保每个子DataFrame仅对应一列变化的行。
内容的提问来源于stack exchange,提问作者robi_beginner
相关产品推荐
相关产品推荐

