如何在Pandas中将指定DataFrame转换为嵌套字典结构
Pandas将带前缀参数的DataFrame转换为嵌套字典
这问题我之前处理类似数据时也遇到过,其实通过拆分参数名+分组转换就能轻松实现,下面是具体的步骤和代码:
首先,先把你提供的DataFrame构建出来(方便复现):
import pandas as pd data = [ ["teachers", 49], ["students", 289], ["R", 3.7], ["holidays", 165], ["OS", 18], ["Em_from", "2020-02-29T20:00:00.000Z"], ["Em_to", "2020-03-20T20:00:00.000Z"], ["Em_F", 3], ["Em_C", 2], ["sC_from", "2020-03-31T20:00:00.000Z"], ["sC_to", "2020-05-29T20:00:00.000Z"], ["sC_F", 25], ["sC_C", 31] ] df = pd.DataFrame(data, columns=["Params", "Value"])
接下来是核心处理逻辑:
- 拆分
Params列,把带下划线的参数拆分为主分组名(比如Em、sC)和子键名(比如from、to);没有下划线的参数单独归类 - 分别处理两类数据:无分组的直接转成键值对,有分组的按分组名聚合为子字典
- 合并所有结果得到目标嵌套字典
具体代码实现:
# 拆分参数列,最多拆分1次,避免多下划线的情况 split_params = df["Params"].str.split("_", n=1, expand=True) df[["group", "sub_key"]] = split_params # 处理没有分组的参数(sub_key为空的行) flat_dict = df[df["sub_key"].isna()].set_index("Params")["Value"].to_dict() # 处理有分组的参数,按group分组后转成子字典 nested_dicts = df[df["sub_key"].notna()].groupby("group").apply( lambda x: x.set_index("sub_key")["Value"].to_dict() ).to_dict() # 合并两个字典得到最终结果 final_dict = {**flat_dict, **nested_dicts} print(final_dict)
运行这段代码后,输出的结果就是你想要的嵌套字典:
{'teachers': 49, 'students': 289, 'R': 3.7, 'holidays': 165, 'OS': 18, 'Em': {'from': '2020-02-29T20:00:00.000Z', 'to': '2020-03-20T20:00:00.000Z', 'F': 3, 'C': 2}, 'sC': {'from': '2020-03-31T20:00:00.000Z', 'to': '2020-05-29T20:00:00.000Z', 'F': 25, 'C': 31}}
这里有几个细节需要注意:
- 使用
str.split("_", n=1)是为了确保只拆分第一个下划线,避免像如果有Em_F_xxx这种多下划线参数时出错 - 用
groupby.apply来聚合每个分组的子键值对,逻辑清晰且高效
内容的提问来源于stack exchange,提问作者Danish
相关产品推荐
相关产品推荐

