高效从Pandas DataFrame生成嵌套字典的方法
高效将Pandas DataFrame转换为网络图嵌套字典
原始数据结构
先确认你的DataFrame结构:
import pandas as pd d = {'I': ['A', 'B', 'C', 'D'], 'X': [1, 0, 3, 1], 'Y': [0, 1, 2, 1], 'Z': [1, 0, 0, 0], 'W': [3, 2, 0, 0]} df = pd.DataFrame(data=d, columns=['I','X', 'Y', 'Z', 'W']) df.set_index('I', inplace=True, drop=True)
高效实现方案
方案一:Pandas向量化操作(stack+分组)
这是处理大数据量最优的方案,完全依赖Pandas底层优化的向量化操作,避免Python级循环:
# 转换为长格式并过滤0值 stacked_df = df.stack().reset_index(name='weight') filtered = stacked_df[stacked_df['weight'] != 0] # 分组构建目标嵌套字典 result = filtered.groupby('I').apply( lambda group: group.set_index('level_1')['weight'].apply(lambda w: {w}).to_dict() ).to_dict() print(result)
输出结果:
{'A': {'X': {1}, 'Z': {1}, 'W': {3}}, 'B': {'Y': {1}, 'W': {2}}, 'C': {'X': {3}, 'Y': {2}}, 'D': {'X': {1}, 'Y': {1}}}
方案二:字典推导+逐行遍历(中等数据量适用)
如果数据量不算极端庞大,这种写法更简洁,效率也远高于逐单元格遍历:
result = { node: {neighbor: {weight} for neighbor, weight in row.items() if weight != 0} for node, row in df.iterrows() }
方案对比
- 方案一:完全基于Pandas的向量化/分组操作,底层由C实现,处理十万级以上数据时优势明显,速度比Python循环快10-100倍。
- 方案二:用字典推导封装逐行遍历,代码简洁易读,适合中等规模数据,比逐单元格遍历效率提升显著。
内容的提问来源于stack exchange,提问作者carpediem
相关产品推荐
相关产品推荐

