如何将Python DataFrame转换为键为行列位置(i,j)的字典?
Pandas DataFrame转行列坐标为键的字典方法
目前pandas没有单独的内置函数直接实现该需求,但可以通过现有接口组合实现,无需手动编写双层遍历逻辑,性能远高于自定义遍历。
方法1:使用numpy.ndenumerate实现(最简洁高效)
直接读取DataFrame对应的numpy二维数组,通过numpy内置的多维枚举方法直接生成目标字典,不受原DataFrame行索引、列名的影响,默认返回0基行列坐标:
import pandas as pd import numpy as np # 示例DataFrame df = pd.DataFrame({ 'col1': [7,8,4], 'col2': [1,9,7], 'col3': [2,6,5] }) # 生成目标字典 result = dict(np.ndenumerate(df.values))
输出结果直接包含你要求的(1,2): 6项。
方法2:使用pandas原生stack方法实现
如果你不想直接调用numpy接口,可以通过调整行列索引为位置序号后,用pandas内置的stack+to_dict组合实现:
# 重置行索引为0基位置序号,列名替换为对应位置序号 df_pos = df.reset_index(drop=True).rename(columns=lambda col: df.columns.get_loc(col)) # 堆叠后转为字典 result = df_pos.stack().to_dict()
注意事项
- 两种方法底层都已经封装了遍历逻辑,无需自己手动循环处理每一个单元格,性能远高于自定义for循环遍历DataFrame的写法,尤其适合大尺寸DataFrame的转换场景。
- 如果你的DataFrame包含空值且需要保留空值对应的坐标项,使用stack方法时需要加
dropna=False参数,即df.stack(dropna=False).to_dict(),numpy方法默认会保留所有位置包括空值位置。 - 你之前找到的
df.stack().index.tolist()默认返回的是(原行标签, 原列名)的列表,不是行列位置坐标,需要先完成行、列索引到位置序号的替换后才能生成符合要求的键。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

