如何将指定结构的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
相关产品推荐
相关产品推荐

