将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
相关产品推荐
相关产品推荐

