如何高效将数据框中每个单元格转换为新数据框的独立行?
如何高效将数据框中每个单元格转换为新数据框的独立行?
嗨,我来给你分享几个比手动循环高效得多的方法,都是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
相关产品推荐
相关产品推荐

