57 lines
2.0 KiB
Python
57 lines
2.0 KiB
Python
import pandas as pd
|
|
|
|
def bianyao_huangjijingshi(Map64Gua: pd.DataFrame, yaoOrig: str) -> pd.DataFrame:
|
|
"""
|
|
皇极经世:变爻计算
|
|
输入原爻(如 '000100'),输出所有变爻之后的卦象合集
|
|
"""
|
|
#print("Map64Gua:",Map64Gua['yaoAll'].apply(type).value_counts())
|
|
# 找到原始卦所在的行
|
|
if 'yaoAll' not in Map64Gua.columns:
|
|
raise ValueError("'yaoAll' 列在 Map64Gua 中不存在,请检查数据")
|
|
|
|
Map64Gua = Map64Gua.copy()
|
|
Map64Gua['yaoAll'] = Map64Gua['yaoAll'].astype(str).str.zfill(6).str.strip()
|
|
yaoOrig = str(yaoOrig).zfill(6).strip()
|
|
|
|
# 找到原始卦所在的行
|
|
matches = Map64Gua[Map64Gua['yaoAll'] == yaoOrig]
|
|
if matches.empty:
|
|
raise ValueError(f"未找到 yaoAll 为 {yaoOrig} 的卦象")
|
|
|
|
k2 = matches.iloc[0] # 取第一行
|
|
|
|
# 计算原卦的二进制值
|
|
a0 = (k2['yao1'] + k2['yao2']*2 + k2['yao3']*4 +
|
|
k2['yao4']*8 + k2['yao5']*16 + k2['yao6']*32)
|
|
|
|
# 依次翻转每一爻,得到新卦的二进制值
|
|
a1 = (k2['yao1'] + k2['yao2']*2 + k2['yao3']*4 +
|
|
k2['yao4']*8 + k2['yao5']*16 + (1 - k2['yao6'])*32)
|
|
|
|
a2 = (k2['yao1'] + k2['yao2']*2 + k2['yao3']*4 +
|
|
k2['yao4']*8 + (1 - k2['yao5'])*16 + k2['yao6']*32)
|
|
|
|
a3 = (k2['yao1'] + k2['yao2']*2 + k2['yao3']*4 +
|
|
(1 - k2['yao4'])*8 + k2['yao5']*16 + k2['yao6']*32)
|
|
|
|
a4 = (k2['yao1'] + k2['yao2']*2 + (1 - k2['yao3'])*4 +
|
|
k2['yao4']*8 + k2['yao5']*16 + k2['yao6']*32)
|
|
|
|
a5 = (k2['yao1'] + (1 - k2['yao2'])*2 + k2['yao3']*4 +
|
|
k2['yao4']*8 + k2['yao5']*16 + k2['yao6']*32)
|
|
|
|
a6 = ((1 - k2['yao1']) + k2['yao2']*2 + k2['yao3']*4 +
|
|
k2['yao4']*8 + k2['yao5']*16 + k2['yao6']*32)
|
|
|
|
# 结果列表
|
|
result = pd.DataFrame()
|
|
|
|
# 查找对应的卦象
|
|
for a in [a0, a1, a2, a3, a4, a5, a6]:
|
|
row = Map64Gua[Map64Gua['value_2binary'] == a]
|
|
if not row.empty:
|
|
result = pd.concat([result, row], ignore_index=True)
|
|
|
|
return result
|