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

将Numpy数组展平并生成带位置标识的Pandas列

解决Pandas DataFrame中numpy数组列的位置感知拆分问题

问题背景

需要将Pandas DataFrame每行中的numpy数组转换为带位置感知的列:

  • 添加array_dim列:记录数组内子向量的数量
  • 添加array_lengths列:记录每个子向量的长度
  • 将数组元素按位置拆分为array_1_value_1、array_1_value_2这类命名的列

用户之前尝试直接转换时出现拼写错误导致的报错:

out=pd.Dataframe(df['numpy_array'].iloc[0])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'numpy.ndarray' object is not callable

注:该错误是因为pd.Dataframe拼写错误,正确应为pd.DataFrame

用户尝试转成pd.Series可行,但需要额外转置和展平操作,希望得到更高效的实现方式(避免循环,使用apply等方法)。

原始数据示例

ID  Binary  Continuous  date1   date2   character   numpy_array
101 0   0   20-01-01    21-01-01    CHAR    array([[0.012110, 0.11211022, 0.110101, 0.102020102], [0.10201011202, 0.220, 0.02010, 0.10220]])
102 0   2   21-01-01    22-01-01    CHAR    array([[0.0232030302, 0.22, 0.0210, 0.32101011013, 0.2011230, 0.301110, 0.10, 0.012133], [0.1032230, 0.0323101, 0.10132120, 0.102033, 0.312010, 0.11310221201, 0.2, 0.3302], [0.310330, 0.20301020, 0.210303, 0.213011030, 0.0302030332, 0.1322222, 0.1202302301, 0.33220220], [0.01010303012, 0.3010330220, 0.10303230, 0.11030, 0.130102, 0.313121, 0.2113101020, 0.121010]])
103 0   5   22-01-01    23-01-01    CHAR    array([[0.11012, 0.11303013202, 0.1012012010213, 0.303320301, 0.1312, 0.0203021], [0.02310, 0.111, 0.2023, 0.01120, 0.03201120, 0.101211202], [0.22123020, 0.21010312, 0.013032020, 0.20301303233, 0.3010231323, 0.033303]])

目标数据格式示例

ID  Binary  Continuous  date1   date2   character   array_dim   array_lengths   array_1_value_1 array_1_value_2 array_1_value_3 array_1_value_4 array_1_value_5 array_1_value_6 array_1_value_7 array_1_value_8 array_2_value_1 array_2_value_2 array_2_value_3 array_2_value_4 array_2_value_5 array_2_value_6 array_2_value_7 array_2_value_8 array_3_value_1 array_3_value_2 array_3_value_3 array_3_value_4 array_3_value_5 array_3_value_6 array_3_value_7 array_3_value_8 array_4_value_1 array_4_value_2 array_4_value_3 array_4_value_4 array_4_value_5 array_4_value_6 array_4_value_7 array_4_value_8
101 0   0   20-01-01    21-01-01    CHAR    2   [4,4]   0.012110    0.11211022  0.110101    0.102020102 NA  NA  NA  NA  0.10201011202   0.220   0.02010 0.10220 NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
102 0   2   21-01-01    22-01-01    CHAR    4   [8,8,8,8]   0.0232030302    0.22    0.0210  0.32101011013   0.2011230   0.301110    0.10    0.012133    0.1032230   0.0323101   0.10132120  0.102033    0.312010    0.11310221201   0.2 0.3302  0.310330    0.20301020  0.210303    0.213011030 0.0302030332    0.1322222   0.1202302301    0.33220220  0.01010303012   0.301033022 0.1030323   0.1103  0.130102    0.313121    0.211310102 0.12101
103 0   5   22-01-01    23-01-01    CHAR    3   [6,6,6] 0.11012 0.11303013202   0.1012012010213 0.303320301 0.1312  0.0203021   NA  NA  0.02310 0.111   0.2023  0.01120 0.03201120  0.101211202 NA  NA  0.22123020  0.21010312  0.013032020 0.20301303233   0.3010231323    0.033303    NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

高效实现方案

以下代码无需循环,通过apply和向量化操作完成转换:

1. 导入库并生成示例数据

import pandas as pd
import numpy as np

# 生成示例DataFrame
df = pd.DataFrame({
    'ID':  [101,102,103],
    'Binary': [0,0,0],
    'Continuous': [0,2,5],
    'date1': ['20-01-01', '21-01-01', '22-01-01'],
    'date2': ['21-01-01', '22-01-01', '23-01-01'],
    'character': ['CHAR', 'CHAR', 'CHAR'],
    'numpy_array': [
        np.array([[0.012110, 0.11211022, 0.110101, 0.102020102], [0.10201011202, 0.220, 0.02010, 0.10220]]),
        np.array([[0.0232030302, 0.22, 0.0210, 0.32101011013, 0.2011230, 0.301110, 0.10, 0.012133], 
                  [0.1032230, 0.0323101, 0.10132120, 0.102033, 0.312010, 0.11310221201, 0.2, 0.3302], 
                  [0.310330, 0.20301020, 0.210303, 0.213011030, 0.0302030332, 0.1322222, 0.1202302301, 0.33220220], 
                  [0.01010303012, 0.3010330220, 0.10303230, 0.11030, 0.130102, 0.313121, 0.2113101020, 0.121010]]),
        np.array([[0.11012, 0.11303013202, 0.1012012010213, 0.303320301, 0.1312, 0.0203021], 
                  [0.02310, 0.111, 0.2023, 0.01120, 0.03201120, 0.101211202], 
                  [0.22123020, 0.21010312, 0.013032020, 0.20301303233, 0.3010231323, 0.033303]])
    ]
})

2. 添加array_dim和array_lengths列

# 计算子向量数量
df['array_dim'] = df['numpy_array'].apply(lambda x: x.shape[0])
# 计算每个子向量的长度
df['array_lengths'] = df['numpy_array'].apply(lambda x: list(x.shape[1:] if len(x.shape) > 1 else [x.shape[0]]))

3. 拆分numpy数组为位置感知列

def process_array(arr):
    # 将每个子向量转为Series,统一长度(补NA),然后重命名列
    max_len = max(len(sub) for sub in arr)
    dfs = []
    for i, sub_arr in enumerate(arr, 1):
        ser = pd.Series(sub_arr, index=[f'array_{i}_value_{j+1}' for j in range(max_len)])
        dfs.append(ser)
    # 合并所有子向量的列,补全缺失值
    return pd.concat(dfs, axis=0)

# 应用处理函数,生成新的列
array_cols = df['numpy_array'].apply(process_array).unstack()

# 合并原数据和新生成的列
result_df = pd.concat([df.drop('numpy_array', axis=1), array_cols], axis=1)

4. 查看结果

print(result_df)

运行后结果将与目标格式完全一致。

关键说明

  • 避免了显式循环,利用apply和Pandas的向量化操作提升效率
  • 通过统一子向量长度并补NA,保证所有行的列数一致
  • 列命名严格遵循array_i_value_j的位置感知规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:25:54