如何对Pandas DataFrame单行值排列组合并保留非组合列?
解决方法
可以通过笛卡尔积生成+行展开的方式实现需求,以下是两种实用方案:
方案一:临时列拆分法
这种方法利用临时列存储组合结果,再拆分展开,代码简洁直观:
import pandas as pd import itertools # 原数据 data = {"Name":["name1", "name2"], "A": [[1, 2, 3], [1]], "B": [["a", "b"], ["a"]]} df = pd.DataFrame(data) # 1. 生成每行A、B列的笛卡尔积组合,存入临时列 df['combinations'] = df.apply(lambda row: list(itertools.product(row['A'], row['B'])), axis=1) # 2. 展开临时列,每个组合单独成行 df_exploded = df.explode('combinations') # 3. 将元组拆分回A、B列 df_exploded[['A', 'B']] = pd.DataFrame(df_exploded['combinations'].tolist(), index=df_exploded.index) # 4. 移除临时列,得到最终结果 result = df_exploded.drop('combinations', axis=1) print(result)
方案二:逐行生成拼接法
这种方法直接为每行生成展开后的DataFrame,再拼接成最终结果,逻辑更清晰:
import pandas as pd import itertools # 原数据 data = {"Name":["name1", "name2"], "A": [[1, 2, 3], [1]], "B": [["a", "b"], ["a"]]} df = pd.DataFrame(data) def expand_row(row): # 生成当前行A、B的所有组合 combo_list = list(itertools.product(row['A'], row['B'])) # 返回当前行展开后的小DataFrame return pd.DataFrame({ 'Name': [row['Name']] * len(combo_list), 'A': [item[0] for item in combo_list], 'B': [item[1] for item in combo_list] }) # 遍历每行生成展开数据,再拼接 result = pd.concat([expand_row(row) for _, row in df.iterrows()], ignore_index=True) print(result)
两种方案最终都会输出你需要的结构,同时完整保留Name这类非组合列。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

