将pandas.DataFrame转换为以数据为键的字典
在做紫微斗数排盘程序的时候,很容易根据四化口诀做出下面的csv数据:
csv_content = """天干,禄,权,科,忌 甲,廉贞,破军,武曲,太阳 乙,天机,天梁,紫微,太阴 丙,天同,天机,文昌,廉贞 丁,太阴,天同,天机,巨门 戊,贪狼,太阴,太阳,天机 己,武曲,贪狼,天梁,文曲 庚,太阳,武曲,天府,天同 辛,巨门,太阳,文曲,文昌 壬,天梁,紫微,天府,武曲 癸,破军,巨门,太阴,贪狼"""
但是在实际使用的时候,却是在根据星曜名称去找相关的天干,查询四化情况,以致于在设置星曜四化的函数中对每一个星曜制作了类似于下面的天干四化字典:
# 廉贞的天干四化
lianzhen_stem_changes = {'甲': '禄', '丙': '忌'}
如果直接将上面的csv转换成形如下面的字典的字典,在需要查找星曜的四化时,先通过星曜名称找到对应的四化字典,再从四化字典中取出四化,那就比较简单了。
star_changes_dict = {'廉贞': {'甲': '禄', '丙': '忌'},
'破军': {'甲': '权', '癸': '禄'},
'武曲': {'甲': '科', '己': '禄', '庚': '权', '壬': '忌'},
'太阳': {'甲': '忌', '戊': '科', '庚': '禄', '辛': '权'},
'天机': {'乙': '禄', '丙': '权', '丁': '科', '戊': '忌'},
'天梁': {'乙': '权', '己': '科', '壬': '禄'},
'紫微': {'乙': '科', '壬': '权'},
'太阴': {'乙': '忌', '丁': '禄', '戊': '权', '癸': '科'},
'天同': {'丙': '禄', '丁': '权', '庚': '忌'},
'文昌': {'丙': '科', '辛': '忌'},
'巨门': {'丁': '忌', '辛': '禄', '癸': '权'},
'贪狼': {'戊': '禄', '己': '权', '癸': '忌'},
'文曲': {'己': '忌', '辛': '科'},
'天府': {'庚': '科', '壬': '科'}}
这实际上是一个将pandas.DataFrame转换为以数据为键的字典的过程,实现代码如下:
import pandas as pd
from io import StringIO
# 模拟 CSV 文件内容
csv_content = """天干,禄,权,科,忌
甲,廉贞,破军,武曲,太阳
乙,天机,天梁,紫微,太阴
丙,天同,天机,文昌,廉贞
丁,太阴,天同,天机,巨门
戊,贪狼,太阴,太阳,天机
己,武曲,贪狼,天梁,文曲
庚,太阳,武曲,天府,天同
辛,巨门,太阳,文曲,文昌
壬,天梁,紫微,天府,武曲
癸,破军,巨门,太阴,贪狼"""
# 读取 CSV 文件内容
df = pd.read_csv(StringIO(csv_content))
# 初始化一个空字典来存储转换后的结果
star_dict = {}
# 遍历DataFrame的每一行
for _, row in df.iterrows():
# 取出天干,作为字典内部的天干四化字典的键
stem = row['天干']
for change_type in ['禄', '权', '科', '忌']:
# 取出禄、权、科、忌对应的星曜,作为外部字典的键
star = row[change_type]
# 如果星曜没有包含在外部字典中,则添加空字典项
if star not in star_dict:
star_dict[star] = {}
# 在外部字典的值中以天干为键四化类型为值增加一个字典项
star_dict[star][stem] = change_type
# 输出结果
for key in star_dict.keys():
print(f"'{key}': {star_dict[key]}")
# 输出贪狼星的天干四化字典
key = '贪狼'
print(star_dict[key]) if key in star_dict.keys() else print('not found')
程序输出如下:
'廉贞': {'甲': '禄', '丙': '忌'}
'破军': {'甲': '权', '癸': '禄'}
'武曲': {'甲': '科', '己': '禄', '庚': '权', '壬': '忌'}
'太阳': {'甲': '忌', '戊': '科', '庚': '禄', '辛': '权'}
'天机': {'乙': '禄', '丙': '权', '丁': '科', '戊': '忌'}
'天梁': {'乙': '权', '己': '科', '壬': '禄'}
'紫微': {'乙': '科', '壬': '权'}
'太阴': {'乙': '忌', '丁': '禄', '戊': '权', '癸': '科'}
'天同': {'丙': '禄', '丁': '权', '庚': '忌'}
'文昌': {'丙': '科', '辛': '忌'}
'巨门': {'丁': '忌', '辛': '禄', '癸': '权'}
'贪狼': {'戊': '禄', '己': '权', '癸': '忌'}
'文曲': {'己': '忌', '辛': '科'}
'天府': {'庚': '科', '壬': '科'}
{'戊': '禄', '己': '权', '癸': '忌'} # 贪狼星的天干四化字典