如何用Pandas将多个同构DataFrame按行展平合并为新DataFrame
问题
现有一个包含91999个结构一致的DataFrame的列表frames,每个子DataFrame为200行×9列。需要创建一个新DataFrame,要求:
- 将每个子DataFrame的
phone_accel_x、phone_accel_y、phone_accel_z、phone_gyro_x、phone_gyro_y、phone_gyro_z共6列的200行数据展平为一行 - 添加对应的
activity列(默认每个子DataFrame的activity列所有行值统一) - 最终新表维度为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
相关产品推荐
相关产品推荐

