如何使用Pandas展开长度不同的两列列表数据
更简洁的统一解决方案
不需要拆分不同长度的行分别处理,可以通过对每一行根据列表长度选择配对方式,一次性生成目标结果:
import pandas as pd from itertools import product def expand_row(row): b_items = row['B'] c_items = row['C'] # 列表长度相同时用zip一一配对,不同时用笛卡尔积全配对 if len(b_items) == len(c_items): pairs = list(zip(b_items, c_items)) else: pairs = list(product(b_items, c_items)) # 构造当前行的展开结果,添加A列 return pd.DataFrame(pairs, columns=['B', 'C']).assign(A=row['A']) # 构造原始DataFrame df = pd.DataFrame( {'A': ['x1','x2','x3', 'x4'], 'B':[['v1','v2'],['v3','v4'],['v6'],['v7','v8']], 'C':[['c1','c2'],['c3','c4'],['c5','c6'],['c7']]} ) # 展开所有行并合并结果 df_exploded = pd.concat([expand_row(row) for _, row in df.iterrows()], ignore_index=True) # 调整列顺序为A、B、C df_exploded = df_exploded[['A', 'B', 'C']]
运行后得到的结果和目标完全一致:
A B C 0 x1 v1 c1 1 x1 v2 c2 2 x2 v3 c3 3 x2 v4 c4 4 x3 v6 c5 5 x3 v6 c6 6 x4 v7 c7 7 x4 v8 c7
方案优势
- 逻辑统一:不需要拆分DataFrame,用一个函数处理所有行的情况
- 代码简洁:仅需少量代码完成需求,可读性强
- 扩展性好:如果后续新增类似的列表列,只需修改函数中的配对逻辑即可
内容的提问来源于stack exchange,提问作者KiwiFT
相关产品推荐
相关产品推荐

