如何将DataFrame中数组类型列展平为多列(动态适配形状)
动态展平Pandas DataFrame中的数组列
原始数据生成代码
import pandas as pd import numpy as np df = pd.DataFrame({'Data': [np.array([[1,1], [2,2], [3,1], [10,1]]), np.array([[11,1],[12,1],[13,1],[20,1]]), np.array([[11,1],[13,1],[14,1],[20,1]])], 'label' : ['a', 'a', 'b']})
需求说明
需要将Data列中存储的二维数组动态展平为连续的多列(如示例中生成col_1至col_8),要求适配任意统一形状的数组,不使用硬编码的列数或长度数值。
解决方案
以下是两种高效实现方式,均支持动态适配数组形状:
方法1:结合apply与concat(易读性高)
# 获取单个数组展平后的总长度(适配动态形状) flat_total_length = df['Data'].iloc[0].size # 生成动态列名 column_names = [f'col_{idx+1}' for idx in range(flat_total_length)] # 将每个数组展平为一维,转为DataFrame flattened_df = pd.DataFrame( df['Data'].apply(lambda arr: arr.flatten()).tolist(), columns=column_names ) # 合并原DataFrame的其他列与展平后的列 result = pd.concat([df.drop('Data', axis=1), flattened_df], axis=1) print(result)
方法2:基于Numpy向量化操作(性能更优)
当数据量较大时,推荐使用Numpy的向量化操作替代apply,提升运行效率:
flat_total_length = df['Data'].iloc[0].size column_names = [f'col_{idx+1}' for idx in range(flat_total_length)] # 直接将所有展平后的数组堆叠为二维数组 flattened_array = np.vstack(df['Data'].apply(lambda arr: arr.flatten())) flattened_df = pd.DataFrame(flattened_array, columns=column_names) result = pd.concat([df.drop('Data', axis=1), flattened_df], axis=1) print(result)
输出示例
执行后会得到如下结构的DataFrame:
label col_1 col_2 col_3 col_4 col_5 col_6 col_7 col_8 0 a 1 1 2 2 3 1 10 1 1 a 11 1 12 1 13 1 20 1 2 b 11 1 13 1 14 1 20 1
注意事项
- 上述方法默认
Data列中所有数组的形状完全一致,若存在形状不一致的数组,展平后长度不同会导致报错,这种场景需额外处理(如填充缺失值)。
内容的提问来源于stack exchange,提问作者user6703592
相关产品推荐
相关产品推荐

