如何用更简洁方式将Pandas DataFrame转换为嵌套字典(非列表推导式)
Pandas DataFrame转换为指定嵌套字典的简洁实现
原始DataFrame定义
import pandas as pd df = pd.DataFrame.from_records( [(1,2,3,4,5,6,7), (8,9,10,11,12,13,14), (15,16,17,18,19,20,21) ], columns=['c1','c2','c3','c4','c5','c6','c7'])
目标嵌套字典结构
[{'one': {'f1': 1, 'f2': 2}, 'two': {'f3': 3, 'f4': 4, 'f5': 5}, 'three': {'f6': 6}, 'four': {'f7': 7}}, {'one': {'f1': 8, 'f2': 9}, 'two': {'f3': 10, 'f4': 11, 'f5': 12}, 'three': {'f6': 13}, 'four': {'f7': 14}}, {'one': {'f1': 15, 'f2': 16}, 'two': {'f3': 17, 'f4': 18, 'f5': 19}, 'three': {'f6': 20}, 'four': {'f7': 21}}]
现有列表推导式实现
l1 = [{'one':{'f1':e1,'f2':e2}, 'two':{'f3':e3,'f4':e4,'f5':e5}, 'three':{'f6':e6}, 'four':{'f7':e7}} for e1,e2,e3,e4,e5,e6,e7 in list(df.to_records(index=False))] print(l1)
更简洁的Pandas内置函数实现
可以利用df.apply()结合自定义逻辑实现,代码结构更直观,无需手动解构行元素:
方式1:自定义函数+apply
def row_to_nested(row): return { 'one': {'f1': row['c1'], 'f2': row['c2']}, 'two': {'f3': row['c3'], 'f4': row['c4'], 'f5': row['c5']}, 'three': {'f6': row['c6']}, 'four': {'f7': row['c7']} } result = df.apply(row_to_nested, axis=1).tolist() print(result)
方式2:匿名函数简化版
result = df.apply(lambda row: { 'one': {'f1': row['c1'], 'f2': row['c2']}, 'two': {'f3': row['c3'], 'f4': row['c4'], 'f5': row['c5']}, 'three': {'f6': row['c6']}, 'four': {'f7': row['c7']} }, axis=1).tolist()
这种方式依托Pandas原生方法处理,可读性和维护性更强,后续调整嵌套结构时只需修改字典定义即可。
内容的提问来源于stack exchange,提问作者Niltzable
相关产品推荐
相关产品推荐

