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

如何将嵌套NumPy结构化数组转换为带嵌套表头的Pandas DataFrame?

展开嵌套NumPy结构化数组为Pandas DataFrame

问题重现

先构建符合描述的嵌套结构化数组,展示直接转换的问题:

import numpy as np
import pandas as pd

# 定义嵌套结构化数据类型
nested_dtype = [
    ('timestamp', 'datetime64[s]'),
    ('measured', [('temp', 'f8'), ('humidity', 'f8')]),
    ('var', [('id', 'i4'), ('location', 'U10')])
]

# 创建示例数组
data = np.array([
    (np.datetime64('2023-10-01 00:00:00'), (25.5, 60.2), (1, 'RoomA')),
    (np.datetime64('2023-10-01 00:10:00'), (26.1, 59.8), (2, 'RoomB'))
], dtype=nested_dtype)

# 直接转换为DataFrame,嵌套列未展开
df_raw = pd.DataFrame(data)
print(df_raw)

输出中measured和var列是嵌套的结构化对象,而非单独的字段列。

解决方案:手动展开嵌套列并拼接列名

通过提取嵌套列的字段,添加父列名前缀后与原非嵌套列拼接:

方法1:针对指定嵌套列处理

# 提取非嵌套列(如timestamp)
non_nested_df = df_raw[['timestamp']]

# 展开measured列,添加前缀
measured_df = pd.DataFrame(df_raw['measured'].tolist(), columns=['temp', 'humidity'])
measured_df = measured_df.add_prefix('measured_')

# 展开var列,添加前缀
var_df = pd.DataFrame(df_raw['var'].tolist(), columns=['id', 'location'])
var_df = var_df.add_prefix('var_')

# 拼接所有DataFrame得到最终结果
final_df = pd.concat([non_nested_df, measured_df, var_df], axis=1)
print(final_df)

方法2:通用自动展开(适配任意嵌套列)

如果有多个嵌套列,可通过遍历自动识别并展开:

def flatten_nested_structured_array(arr):
    df = pd.DataFrame(arr)
    flat_components = []
    for col_name in df.columns:
        col_data = df[col_name]
        # 判断是否为嵌套结构化类型
        if isinstance(col_data.iloc[0], np.void):
            # 转换为子DataFrame并添加前缀
            nested_df = pd.DataFrame(col_data.tolist())
            nested_df = nested_df.add_prefix(f'{col_name}_')
            flat_components.append(nested_df)
        else:
            # 非嵌套列直接保留
            flat_components.append(df[[col_name]])
    # 拼接所有组件
    return pd.concat(flat_components, axis=1)

# 调用函数得到展开后的DataFrame
final_df = flatten_nested_structured_array(data)
print(final_df)

两种方法最终都会得到目标结构:列名包含父列前缀(如measured_temp、var_id),所有嵌套字段均展开为单独列。

关键说明

Pandas默认不会自动解析NumPy嵌套结构化数组的内部字段,而是将每个嵌套元素视为单个对象。因此需要手动提取嵌套字段,通过tolist()将结构化元素转换为可解析的列表,再转换为子DataFrame并添加前缀实现列名拼接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 00:15:37