如何从DataFrame单元格提取列表并生成组合新行?
解决DataFrame中列表单元格的笛卡尔积展开问题
核心思路
不用递归,把所有单元格统一转成列表(非列表元素包装成单元素列表),再用itertools.product生成每行所有列表元素的笛卡尔积,最后重新构建DataFrame即可。
代码实现
首先构造示例数据:
import pandas as pd import itertools # 构造你提供的示例DataFrame df = pd.DataFrame({ 'col1': [['a','b'], 'not a list', 'not a list'], 'col2': ['not a list', ['@', '$'], 'not a list'], 'col3': [[1,2,3], 'not a list', 'not a list'] })
然后定义辅助函数统一处理元素:
# 把非列表元素转成单元素列表,列表则保持原样 def to_list(x): return x if isinstance(x, list) else [x]
最后遍历每行生成展开后的行:
expanded_rows = [] for _, row in df.iterrows(): # 将当前行的每一列都转成列表格式 column_lists = [to_list(row[col]) for col in df.columns] # 生成所有列列表元素的笛卡尔积组合 for combo in itertools.product(*column_lists): expanded_rows.append(combo) # 转换为目标DataFrame result_df = pd.DataFrame(expanded_rows, columns=df.columns)
运行后得到的result_df就是你要的目标格式:
| col1 | col2 | col3 |
|---|---|---|
| a | not a list | 1 |
| a | not a list | 2 |
| a | not a list | 3 |
| b | not a list | 1 |
| b | not a list | 2 |
| b | not a list | 3 |
| not a list | @ | not a list |
| not a list | $ | not a list |
| not a list | not a list | not a list |
说明
这个方法不管一行里有0个、1个还是多个列表,都能正确生成所有可能的组合,逻辑简单直接,比递归更易理解和维护。
内容的提问来源于stack exchange,提问作者loookazs
相关产品推荐
相关产品推荐

