如何重构带有成对正反命名列的复杂Pandas DataFrame
Pandas 成对正反列合并实现代码
你可以直接运行以下代码得到目标结果:
import pandas as pd # 原始数据构造 data4 = {'g_pairs':['an_jk', 'tf_ha', 'ab_rh', 'et_x2','yr_po'], 'g_a':['en762','en72b','en925','en980','en009'], 'g_b':['en361','en231','en666','en771','en909'], 'epi|ap':[0.020,1,0.05,0.7,0.001], 'ap|epi':[1,1,0.1,0.0001,1], 'fib|mac':[0.001,0.002,0.0021,0.3,0.005], 'mac|fib':[0.0002,0.0043,0.0067,0.0123,0.0110]} df4 = pd.DataFrame(data4) # 构造正序行表:保留原g_pairs,取正序列值 df_order = df4[['g_pairs', 'g_a', 'g_b', 'epi|ap', 'fib|mac']].copy() # 构造反序行表:翻转g_pairs,取反序列值并重命名对齐正序表 df_reverse = df4[['g_pairs', 'g_a', 'g_b', 'ap|epi', 'mac|fib']].copy() # 翻转g_pairs:按下划线拆分后反转再拼接 df_reverse['g_pairs'] = df_reverse['g_pairs'].apply(lambda x: '_'.join(x.split('_')[::-1])) # 重命名列和正序表保持一致 df_reverse.columns = ['g_pairs', 'g_a', 'g_b', 'epi|ap', 'fib|mac'] # 合并两个表,按g_a、g_b分组排序得到最终结果 df_result = pd.concat([df_order, df_reverse], ignore_index=True)\ .sort_values(by=['g_a', 'g_b', 'g_pairs'], ignore_index=True) # 打印验证结果 print(df_result)
代码核心逻辑是把原始表拆成正序、反序两个结构完全一致的子表,再合并排序,不需要复杂的长宽表转换,逻辑清晰不容易出错,运行后输出的结果和你给出的目标结构完全一致。
内容的提问来源于stack exchange,提问作者newbzzs
相关产品推荐
相关产品推荐

