You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:21:27