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

如何基于列值变化自动拆分Pandas DataFrame为子DataFrame?

解决方案

核心思路是通过检测列的变化规律,自动识别阶段分界点,再拆分出仅单列变化的子DataFrame,无需预先指定任何阶段信息。

实现步骤与代码

  1. 构造示例数据(可替换为你的真实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)
  1. 自动识别阶段分界点
    通过计算每列的差分,统计每行变化的列数,阶段切换时会有多列同时变化(比如从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))
  1. 拆分并生成子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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:55:20