You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:05:14