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

如何将单个DataFrame拆分并展平为多个DataFrame?

问题:从单个DataFrame拆分出多个目标DataFrame

输入数据

import pandas as pd
from numpy import nan

data = {'ID': {0: 'id1', 1: 'id1', 2: 'id1', 3: 'id1', 4: 'id1', 5: 'id1'}, 
        'hr': {0: 55, 1: 56, 2: 57, 3: 75, 4: 65, 5: 55}, 
        'hrMax': {0: nan, 1: 60.0, 2: 59.0, 3: nan, 4: 70.0, 5: 79.0}, 
        'hrMin': {0: nan, 1: 45.0, 2: 45.0, 3: nan, 4: 45.0, 5: 35.0}}

df = pd.DataFrame(data)

期望输出

得到包含两个DataFrame的列表[D1, D2],格式如下:

D1:
    ID  hr_a  hr_b  hrMax  hrMin
1  id1    55    56   60.0   45.0
2  id1    55    57   59.0   45.0

D2:
    ID  hr_a  hr_b  hrMax  hrMin
4  id1    75    65   70.0   45.0
5  id1    75    55   79.0   35.0

尝试的代码(无法正常运行)

# Select the indexes where df is NaN using hrMax
index = df['hrMax'].index[df['hrMax'].apply(np.isnan)]
df_index = df.index.values.tolist()

# get each sub-dataframe using iloc
for i in range(0, len(index)) :
    df_single_observation = df.iloc[df_index.index(i):df_index.index(i+1)-1]

解决方案

核心思路是先根据hrMax的NaN值划分数据块,再对每个块进行格式转换,生成hr_a和hr_b列:

import pandas as pd
import numpy as np

data = {'ID': {0: 'id1', 1: 'id1', 2: 'id1', 3: 'id1', 4: 'id1', 5: 'id1'}, 
        'hr': {0: 55, 1: 56, 2: 57, 3: 75, 4: 65, 5: 55}, 
        'hrMax': {0: np.nan, 1: 60.0, 2: 59.0, 3: np.nan, 4: 70.0, 5: 79.0}, 
        'hrMin': {0: np.nan, 1: 45.0, 2: 45.0, 3: np.nan, 4: 45.0, 5: 35.0}}

df = pd.DataFrame(data)

# 按hrMax的NaN值划分分组,每个NaN行对应一个新分组的起始
df['group'] = df['hrMax'].isna().cumsum()

# 处理每个分组,生成目标格式的DataFrame
result = []
for _, group_df in df.groupby('group'):
    # 取分组第一个行的hr作为hr_a
    base_hr = group_df.iloc[0]['hr']
    # 取分组中从第二行开始的数据,作为配对的hr_b及对应指标
    pair_rows = group_df.iloc[1:].copy()
    pair_rows['hr_a'] = base_hr
    pair_rows.rename(columns={'hr': 'hr_b'}, inplace=True)
    # 调整列顺序至期望格式
    target_df = pair_rows[['ID', 'hr_a', 'hr_b', 'hrMax', 'hrMin']]
    result.append(target_df)

# 验证输出
for idx, df in enumerate(result, 1):
    print(f"D{idx}:")
    print(df)
    print()

代码说明

  1. 分组划分:df['hrMax'].isna().cumsum()会给每个连续的数据块分配唯一的组ID,hrMax为NaN的行是每个组的开头,后续非NaN行属于同一组。
  2. 分组处理:对每个组,取组内第一个行的hr作为hr_a,将组内剩余行的hr重命名为hr_b,保留对应的hrMax、hrMin和ID。
  3. 结果收集:将每个处理好的分组DataFrame存入列表,最终得到期望的[D1, D2]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:23:25