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

如何高效将数据框中每个单元格转换为新数据框的独立行?

如何高效将数据框中每个单元格转换为新数据框的独立行?

嗨,我来给你分享几个比手动循环高效得多的方法,都是pandas原生的矢量化操作,处理大数据集的时候速度会快到离谱,完全不用再担心数据量增长后代码卡成狗的问题!

  • 用pandas的melt函数(首推)
    这是pandas专门为「宽表转长表」设计的工具,天生就是干这个活的,完全是底层批量处理,没有Python循环的额外开销。结合你的需求(给指定列打标签,其他列标为"other"),可以这么写:

    # 假设你已经定义了column_labels这个列名到标签的映射字典
    New = (Old.melt(var_name="temp_col", value_name="D")
             # 用map匹配标签,匹配不到的就填充"other"
             .assign(E=lambda x: x["temp_col"].map(column_labels).fillna("other"))
             # 删掉临时的temp_col列
             .drop("temp_col", axis=1))
    

    如果你只关心特定列(比如A、B、C),还可以先筛选列再melt,进一步提升效率:

    # 只保留你关心的列,剩下的自动归为"other"的话可以先过滤
    target_cols = ["A", "B", "C"]
    New = (Old[target_cols].melt(var_name="temp_col", value_name="D")
             .assign(E=lambda x: x["temp_col"].map(column_labels))
             .drop("temp_col", axis=1))
    # 如果还有其他列需要处理成"other",可以单独拼接
    other_rows = (Old.drop(target_cols, axis=1).melt(value_name="D")
                     .assign(E="other"))
    New = pd.concat([New, other_rows], ignore_index=True)
    
  • 用stack方法实现
    这也是pandas原生的堆叠方法,把列索引转成行索引后再整理成数据框,效率和melt不相上下,看你个人习惯选哪个:

    # 堆叠所有列,得到带多级索引的Series
    stacked_series = Old.stack()
    # 转成数据框并重置索引
    New = stacked_series.reset_index(name="D")
    # 处理标签映射,填充"other"
    New["E"] = New["level_1"].map(column_labels).fillna("other")
    # 删掉不需要的level_1列(原来的列名)
    New = New.drop("level_1", axis=1).rename(columns={"level_0": "original_row_index"})
    

    这里的original_row_index是原数据框的行索引,如果不需要的话也可以直接删掉。

为什么这些方法比你的循环快这么多?因为pandas的原生函数都是用C实现的底层操作,跳过了Python层面的循环开销——你原来的双重循环每一次都要操作Python列表,数据量一大,这些小开销累加起来就会慢到让人崩溃,而原生方法是批量处理所有数据,效率直接拉满。

备注:内容来源于stack exchange,提问作者m. lekk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:18:06