Python Pandas如何仅对DataFrame单个列执行explode展开操作
问题根源
两个方案失效的核心原因如下:
df.explode('col2')无效果,通常是三个问题导致:- 列名不匹配:数据源列名是大写开头的
Col2,代码里传入的是小写col2,无法定位到目标列; - 未接收返回值:pandas的
explode()没有inplace原地修改参数,执行后会返回全新的DataFrame,如果不把执行结果赋值给变量,原df不会发生任何变化,视觉上就像代码没生效; - 列值类型错误:如果Col2列存的不是原生Python列表,而是读文件/序列化后生成的字符串格式列表(比如值为
"['sub1']"的字符串而非["sub1"]列表),explode无法按列表元素正确拆分。
- 列名不匹配:数据源列名是大写开头的
- 手写concat拼接方案失效原因:仅单独提取Col2列做值展开生成新表,完全没有关联原表的行索引、同步复制其他列的对应值,自然会丢失Col1、Col3和展开后Col2值的匹配关系。
正确实现代码
先做必要的预处理,再调用explode即可自动保留其他列的对应关系,完全匹配预期输出:
import pandas as pd import ast # 构造和描述一致的测试数据源 df = pd.DataFrame({ "Col1": {0: "str0", 1: "str1", 2: "str2"}, "Col2": {0: ["sub1"], 1: ["sub1", "sub2"], 2: ["sub1", "sub2", "sub3"]}, "Col3": {0: "str0", 1: "str1", 2: "str2"} }) # 如果Col2是字符串格式的列表,取消注释下一行完成类型转换 # df["Col2"] = df["Col2"].apply(ast.literal_eval) # 注意传入正确列名,接收explode返回的新DataFrame df_result = df.explode("Col2", ignore_index=True)
执行后得到的df_result结构如下,和预期完全一致:
| Col1 | Col2 | Col3 |
|---|---|---|
| str0 | sub1 | str0 |
| str1 | sub1 | str1 |
| str1 | sub2 | str1 |
| str2 | sub1 | str2 |
| str2 | sub2 | str2 |
| str2 | sub3 | str2 |
如果需要输出无表头的逗号分隔格式,追加一行代码即可:
print(df_result.to_csv(index=False, header=False))
输出结果:
str0,sub1,str0 str1,sub1,str1 str1,sub2,str1 str2,sub1,str2 str2,sub2,str2 str2,sub3,str2
提示:如果使用的pandas版本低于1.3.0,explode方法不支持ignore_index参数,执行完explode后追加
df_result = df_result.reset_index(drop=True)即可重置索引。
内容的提问来源于stack exchange,提问作者gdogg371
相关产品推荐
相关产品推荐

