如何用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
相关产品推荐
相关产品推荐

