Pandas如何高效将数组列多元素值拆分为单独行
问题场景
现有DataFrame的itemIds列以数组形式存储字符串类型的条目,需要完成两项处理:
- 将数组内所有itemId值从字符串转换为整数
- 对包含多个条目的数组,将每个值拆分到单独行存储
之前尝试通过逐行for循环实现逻辑,代码如下:
# 最初的单元素转换逻辑 for i in range(0,len(df)): if len(df["itemIds"][i])<2: df['n'][i]=df.itemIds[i][0] else: df['n'][i] = df.itemIds[i]

后续尝试用循环给多元素数组插行的代码如下:
# 低效的逐行插行逻辑 for i in range(0,len(df)): if len(df.n[i])>1: df.loc[-1]=df.iloc[i]
上述逐行循环的写法在数据量较大时执行效率极低,长时间运行无法完成。
高效实现方法
不要用逐行迭代修改DataFrame的写法,pandas内置的向量化方法执行效率是纯Python循环的数十倍到上百倍,针对数组拆行的需求直接用内置explode方法即可,不需要自行编写循环判断、插行逻辑,完整实现代码如下:
# 1. 批量将itemIds列内所有字符串元素转换为整数 df["itemIds"] = df["itemIds"].apply(lambda id_list: [int(item_id) for item_id in id_list]) # 2. 调用explode直接将数组列拆分为单独行,自动兼容单元素、多元素场景 df = df.explode("itemIds", ignore_index=True) # 3. 若需要和之前逻辑对齐生成n列,直接重命名即可 df = df.rename(columns={"itemIds": "n"})
原写法效率低的核心原因
- 逐行通过
df.loc、链式索引赋值的写法,每次操作都会触发DataFrame的全量内存拷贝,数据量上升后性能会断崖式下跌 - 自行实现插行逻辑属于重复造轮子,
explode是pandas底层C实现的专用方法,百万级数据量也可以在秒级完成处理
注意:如果
itemIds列存在空值、非列表类型的异常值,可以在apply的转换函数中增加类型判断,避免转换时报错,示例写法:lambda id_list: [int(item_id) for item_id in id_list] if isinstance(id_list, list) else []
内容的提问来源于stack exchange,提问作者Franzi Weindel
相关产品推荐
相关产品推荐

