如何将DataFrame分组列中的值对拆分为多列?
解决Pandas分组生成无重复元素对并拆分列的问题
问题说明
需要对Pandas DataFrame按Group列分组,针对指定列(如B_m、B_n)生成无重复的两两元素对(逻辑与itertools.combinations(col, r=2)一致),并拆分为新列B_m1、B_m2、B_n1、B_n2;同时移除仅含1行的分组,分组含4行及以上时同样生成所有无重复组合。
原始DataFrame:
import pandas as pd from itertools import combinations df = pd.DataFrame( data=[ [0, 4, 7, -1, 0.9], [0, 4, 7, 0, 0.3], [0, 4, 7, 1, 0.2], [1, 3, 3, 1, 0.5], [1, 3, 3, 0, 0.2], [2, 1, 8, 0, 0.6], ], columns=['Group', 'A_x', 'A_y', 'B_m', 'B_n'], )
解决方案
利用groupby结合自定义函数,配合itertools.combinations实现高效处理,避免低效循环:
def process_group(g): # 跳过行数不足2的分组 if len(g) < 2: return pd.DataFrame() # 提取分组内固定的列值(同一Group的A_x、A_y值一致) group_base = g[['Group', 'A_x', 'A_y']].iloc[0].to_dict() # 生成目标列的两两无重复组合 b_m_pairs = list(combinations(g['B_m'], r=2)) b_n_pairs = list(combinations(g['B_n'], r=2)) # 构造结果DataFrame result_df = pd.DataFrame({ 'B_m1': [pair[0] for pair in b_m_pairs], 'B_m2': [pair[1] for pair in b_m_pairs], 'B_n1': [pair[0] for pair in b_n_pairs], 'B_n2': [pair[1] for pair in b_n_pairs] }) # 添加分组固定信息 for col, val in group_base.items(): result_df[col] = val # 调整列顺序匹配预期格式 return result_df[['Group', 'A_x', 'A_y', 'B_m1', 'B_m2', 'B_n1', 'B_n2']] # 按Group分组处理并合并结果 final_output = df.groupby('Group').apply(process_group).reset_index(drop=True) print(final_output)
输出结果
运行后得到的结果与预期完全一致:
Group A_x A_y B_m1 B_m2 B_n1 B_n2 0 0 4 7 -1 0 0.9 0.3 1 0 4 7 -1 1 0.9 0.2 2 0 4 7 0 1 0.3 0.2 3 1 3 3 1 0 0.5 0.2
代码说明
process_group函数:负责单个分组的处理,先过滤行数不足2的无效分组;提取同一分组内固定的Group、A_x、A_y值;对目标列生成两两组合,最后构造并返回符合格式的结果DataFrame。groupby.apply:将自定义函数批量应用到每个分组,自动合并所有有效分组的结果。reset_index(drop=True):清理分组后产生的多级索引,得到结构整洁的最终结果。
这种方法依托Pandas的分组机制和itertools的高效组合生成能力,代码简洁且性能远优于手动循环。
内容的提问来源于stack exchange,提问作者Gozmit97
相关产品推荐
相关产品推荐

