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

如何用Pandas以笛卡尔积方式实现多列explode?

实现多列列表的笛卡尔积展开(替代默认explode的一对一映射)

不需要用循环,有两种优雅的解决方法,可根据列数和需求选择:

方法一:分步执行explode(适合少量列表列)

如果只有2-3个列表列,直接依次对每个列表列执行explode即可。先展开第一列,再展开第二列,自动生成同一行内各列表的笛卡尔积:

import pandas as pd

df = pd.DataFrame({'A': [[0, 1],5],
                   'B': 1,
                   'C': [['a', 'b'], 'phau']})

# 先展开A列,再展开C列
df_result = df.explode('A').explode('C')
print(df_result)

输出结果:

A  B     C
0  0  1     a
0  0  1     b
0  1  1     a
0  1  1     b
1  5  1  phau

这种方法代码极简、逻辑直观,适合列表列数量不多的场景。

方法二:通用笛卡尔积展开(支持任意数量列表列)

如果有多个列表列,或者需要更通用的处理逻辑,可以通过pd.MultiIndex.from_product生成笛卡尔积,再和非列表列合并:

import pandas as pd

df = pd.DataFrame({'A': [[0, 1],5],
                   'B': 1,
                   'C': [['a', 'b'], 'phau']})

def expand_row(row):
    # 区分列表列和非列表列
    list_columns = [col for col in df.columns if isinstance(row[col], list)]
    non_list_data = {col: row[col] for col in df.columns if col not in list_columns}
    # 获取所有列表列的元素集合
    list_values = [row[col] for col in list_columns]
    
    # 生成笛卡尔积并转为DataFrame
    cartesian_df = pd.MultiIndex.from_product(list_values, names=list_columns).to_frame(index=False)
    # 重复非列表列数据,匹配笛卡尔积的行数
    non_list_df = pd.DataFrame([non_list_data] * len(cartesian_df))
    
    return pd.concat([non_list_df, cartesian_df], axis=1)

# 对每行应用函数并合并结果
final_result = pd.concat([expand_row(row) for _, row in df.iterrows()], ignore_index=False)
# 可选:重置索引
final_result = final_result.reset_index(drop=True)
print(final_result)

这种方法可以处理任意数量的列表列,不管每行的列表列数量是否一致,都能正确生成笛卡尔积展开的结果。

内容的提问来源于stack exchange,提问作者RezwanU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:22:07