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

如何用Pandas将多个同构DataFrame按行展平合并为新DataFrame

问题

现有一个包含91999个结构一致的DataFrame的列表frames,每个子DataFrame为200行×9列。需要创建一个新DataFrame,要求:

  1. 将每个子DataFrame的phone_accel_x、phone_accel_y、phone_accel_z、phone_gyro_x、phone_gyro_y、phone_gyro_z共6列的200行数据展平为一行
  2. 添加对应的activity列(默认每个子DataFrame的activity列所有行值统一)
  3. 最终新表维度为91999行×1201列(200×6 + 1)

用户尝试了以下代码但无法正确实现堆叠:

sensors_frames = []
for i in range(0, len(frames)):
        t = frames[i][['phone_accel_x', 'phone_accel_y', 'phone_accel_z', 
                   'phone_gyro_x', 'phone_gyro_y', 'phone_gyro_z', 'activity']].values
        sensors_frames.append(t)

解决方案

方法一:循环逐行处理(直观易调试)

核心逻辑是对每个子DataFrame单独处理:先展平6个传感器列的200行数据,再提取统一的activity值,最后将两者组合成一行存入列表,最终合并为大DataFrame。

import pandas as pd

processed_rows = []
# 定义需要提取的传感器列
sensor_cols = ['phone_accel_x', 'phone_accel_y', 'phone_accel_z', 
               'phone_gyro_x', 'phone_gyro_y', 'phone_gyro_z']

for df in frames:
    # 展平传感器列的200行数据为一维数组
    flattened_sensors = df[sensor_cols].values.flatten()
    # 获取当前子DF的activity值(假设所有行值一致,取第一行即可)
    activity_val = df['activity'].iloc[0]
    # 组合成一行数据
    row_data = list(flattened_sensors) + [activity_val]
    processed_rows.append(row_data)

# 生成列名并构建最终DataFrame
sensor_col_names = [f"{col}_{idx}" for col in sensor_cols for idx in range(200)]
final_df = pd.DataFrame(processed_rows, columns=sensor_col_names + ['activity'])

方法二:批量分组处理(大数据量更高效)

通过给每个子DataFrame添加分组标识,合并后用groupby批量展平,适合数据量较大的场景:

import pandas as pd

sensor_cols = ['phone_accel_x', 'phone_accel_y', 'phone_accel_z', 
               'phone_gyro_x', 'phone_gyro_y', 'phone_gyro_z']

# 给每个子DF添加唯一分组ID,用于后续分组处理
for group_id, df in enumerate(frames):
    df['group_id'] = group_id

# 合并所有子DF为一个大表
combined_df = pd.concat(frames, ignore_index=True)

# 按分组ID批量展平传感器列,并保留activity值
final_df = combined_df.groupby('group_id').apply(
    lambda x: pd.Series(
        x[sensor_cols].values.flatten().tolist() + [x['activity'].iloc[0]]
    )
).reset_index(drop=True)

# 设置列名
sensor_col_names = [f"{col}_{idx}" for col in sensor_cols for idx in range(200)]
final_df.columns = sensor_col_names + ['activity']

问题说明

原代码的核心问题是:直接提取values得到的是200×7的二维数组,append后列表中存储的是大量二维数组,无法直接堆叠成目标的91999×1201结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:40:37