You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定结构的pandas DataFrame转换为列名对应规则的字典

问题描述

现有如下结构的Python pandas DataFrame:

import pandas as pd
import numpy as np

myDF = pd.DataFrame({
    "COLUMN_NAME": ["Col1", "Col2", "Col3", "Col4"],
    "RULE_1": ["NULL", "DUPLICATE", "TEXT-ONLY", "INTEGER-ONLY"],
    "RULE_2": ["DUPLICATE", np.nan, "DUPLICATE", np.nan] 
})

需要将其转换为如下格式的字典:

my_dict = {"Col1": ["NULL", "DUPLICATE"], "Col2": ["DUPLICATE"], "Col3": ["TEXT-ONLY", "DUPLICATE"], "Col4": ["INTEGER-ONLY"]}

此前尝试编写多层循环实现未成功,未完成的参考代码如下:

from collections import defaultdict

final_rules_dict = defaultdict(list)
for k in rule_dict:
    row_dict = rule_dict[k]
    for k in row_dict:
        col_name = k
        if col_name == "COLUMN_NAMES":
            final_rules_dict[col_name].append()
实现方案

无需编写复杂的多层循环,可直接通过pandas内置方法快速实现,核心逻辑是将列名设为索引后,过滤每行的空规则值,再聚合为列表转字典即可。

方法一:链式调用最简写法

一行代码即可完成转换:

my_dict = myDF.set_index("COLUMN_NAME").stack().groupby(level=0).agg(list).to_dict()

逻辑拆解:

  • set_index("COLUMN_NAME"):将存储列名的COLUMN_NAME列设为行索引,作为后续字典的键
  • stack():将RULE_1、RULE_2等规则列从宽格式转为长格式,转换过程会自动过滤np.nan空值
  • groupby(level=0).agg(list):按第一层索引(即原列名)分组,将同列名下的所有规则值聚合为列表
  • to_dict():将处理后的结果直接转换为目标格式的字典

方法二:逐行遍历写法(逻辑直观易修改)

如果更习惯逐行处理的逻辑,也可以通过遍历行实现,适配规则列数量不固定的场景:

# 自动识别所有规则列(以RULE开头的列),无需硬编码列名
rule_cols = [col for col in myDF.columns if col.startswith("RULE")]
my_dict = {}
for _, row in myDF.iterrows():
    # 收集当前列名下所有非空的规则
    my_dict[row["COLUMN_NAME"]] = [
        row[col] for col in rule_cols 
        if pd.notna(row[col])
    ]

内容的提问来源于stack exchange,提问作者matt.aurelio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:54:17