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

将DataFrame中含'.'的列与嵌套字段转换为字典结构

处理DataFrame中含点号的列名与嵌套字典键的层级转换

需求说明

需要将示例中的df转换为df1结构,完成两个核心转换:

  • 将列名包含.的字段(如in.1、in.2)合并为嵌套字典
  • 将B列内键包含.的嵌套字段(如"C.i"、"C.j")转换为层级字典结构

示例数据

import pandas as pd

# 原始DataFrame
df = pd.DataFrame({'A': [1], 'in.1': [8977], 'in.2': [8977], 'B': [
    {
        "C.i": 87387460,
        "C.j":233
}]})

# 目标结构DataFrame
df1 = pd.DataFrame({'A': [1], 'in':{'1': [8977], '2': [8977]}, 'B': [
    {"C":{
        "i": 87387460,
        "j":233}
}]})

原递归函数的问题

你编写的convert_df函数仅针对DataFrame的行列结构做递归处理,没有针对含点号的列名/字典键做拆分与层级合并逻辑,因此无法实现需求中的嵌套转换。

解决方案

我们需要编写两个辅助函数,分别处理字典键的层级拆分和DataFrame列名的合并,最终组合完成转换:

1. 字典键层级转换函数

该函数负责将带点号的扁平字典键转换为嵌套字典结构:

def flatten_to_nested_dict(flat_dict):
    nested = {}
    for key, value in flat_dict.items():
        # 按点号拆分键
        key_parts = key.split('.')
        current_level = nested
        # 逐层创建嵌套字典
        for part in key_parts[:-1]:
            current_level = current_level.setdefault(part, {})
        # 设置最终层级的值
        current_level[key_parts[-1]] = value
    return nested

2. DataFrame列名与嵌套字段处理函数

该函数先处理DataFrame的列名合并,再处理B列内的字典结构,最终生成目标DataFrame:

def process_df_conversion(df):
    processed_rows = []
    # 遍历每行数据处理
    for _, row in df.iterrows():
        row_dict = {}
        nested_cols = {}
        
        # 处理含点号的列名,合并为嵌套字典
        for col_name, val in row.items():
            if '.' in col_name:
                main_key, sub_key = col_name.split('.', 1)
                if main_key not in nested_cols:
                    nested_cols[main_key] = {}
                nested_cols[main_key][sub_key] = val
            else:
                row_dict[col_name] = val
        
        # 合并嵌套列到行字典
        row_dict.update(nested_cols)
        
        # 处理B列内的扁平字典,转换为嵌套结构
        if 'B' in row_dict:
            row_dict['B'] = flatten_to_nested_dict(row_dict['B'])
        
        processed_rows.append(row_dict)
    
    # 将处理后的行数据转换为DataFrame
    return pd.DataFrame(processed_rows)

测试转换效果

# 执行转换
result_df = process_df_conversion(df)
print(result_df)

输出结果与目标df1结构一致:

A                     in                          B
0  1  {'1': 8977, '2': 8977}  {'C': {'i': 87387460, 'j': 233}}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:55:37