如何将DataFrame中列表类型列拆分为同名列的多行数据?
解决DataFrame列表列转多行并去重的问题
问题场景
原始DataFrame如下:
date bumpSizes 12/9/23 ['-0.2','-0.4','0.8'] 12/9/23 ['-0.2', '-0.3']
需求是将bumpSizes列的列表元素转为同一列的多行数据,同时保留唯一值,目标结果如下:
index bumpSizes 12/9/23 -0.2 12/9/23 -0.4 12/9/23 0.8 12/9/23 -0.3
你尝试过以下两种方法但未达到预期:
- 该方法将数据拆分为多列而非多行:
df["bumpSizes"]=df["bumpSizes"].str.replace("'","").str.replace ("[","").str.replace ("]","").str.split(",", expand=True)
- 此方法也未实现需求:
df.assign("bump_new",df.bumpSizes)
解决方案
核心思路
先将字符串格式的列表转为真实的Python列表,再用explode方法展开为多行,最后去重得到目标结果。
分步实现
- 字符串转真实列表
原始bumpSizes列的内容是字符串形式的列表,需用ast.literal_eval转换为可操作的列表:
import ast df["bumpSizes"] = df["bumpSizes"].apply(ast.literal_eval)
- 列表列展开为多行
使用pandas的explode方法,将每个列表元素拆分为单独行,保留对应date值:
df_exploded = df.explode("bumpSizes")
- 去重整理
对展开后的DataFrame去重,得到最终结果:
df_result = df_exploded.drop_duplicates().reset_index(drop=True)
完整代码
import pandas as pd import ast # 构造原始DataFrame df = pd.DataFrame({ "date": ["12/9/23", "12/9/23"], "bumpSizes": ["['-0.2','-0.4','0.8']", "['-0.2', '-0.3']"] }) # 字符串转列表 df["bumpSizes"] = df["bumpSizes"].apply(ast.literal_eval) # 展开为多行 df_exploded = df.explode("bumpSizes") # 去重 df_result = df_exploded.drop_duplicates().reset_index(drop=True) print(df_result)
运行后输出:
date bumpSizes 0 12/9/23 -0.2 1 12/9/23 -0.4 2 12/9/23 0.8 3 12/9/23 -0.3
内容的提问来源于stack exchange,提问作者Vasanth
相关产品推荐
相关产品推荐

