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

如何无需删除空值将Pandas DataFrame转为长格式?

无需删除空值实现DataFrame转长格式

嘿,我来帮你搞定这个问题!你现在用melt加dropna()的方法虽然能实现需求,但确实可以更高效——直接从处理过程中跳过空值,不用事后清理。

先还原你的初始DataFrame,方便测试:

import pandas as pd

df = pd.DataFrame([['a', 'b'], ['d', 'e'], ['f', 'g', 'h'], ['q', 'r', 'e', 't']])
df = df.rename(columns={0: "Key"})

最优方案:用stack()一步到位

stack()方法天生就会忽略空值(NaN),完美适配你的需求,代码如下:

new_df = df.set_index('Key').stack().reset_index(name='value').drop(columns='level_1')

给你拆解下每一步的作用:

  • set_index('Key'):把Key列设为索引,这样剩下的所有列都是我们要转换的“值列”
  • stack():把列维度的内容堆叠到行维度,自动跳过所有空值,这一步就帮你省去了删除空值的操作
  • reset_index(name='value'):重置索引,把堆叠后的值列命名为value,此时会多出一个level_1列(记录原来的列名)
  • drop(columns='level_1'):删掉不需要的level_1列,就得到你想要的最终结果

运行后得到的new_df就是你目标的格式:

Key value
0   a     b
1   d     e
2   f     g
3   f     h
4   q     r
5   q     e
6   q     t

如果你更偏爱melt的话

要是你习惯用melt,也可以结合query()直接过滤空值,不用单独调用dropna():

new_df = df.melt(id_vars=['Key'], value_name='value')\
           .query('value.notna()')\
           [['Key', 'value']]\
           .reset_index(drop=True)

不过这个本质还是过滤空值,只是把两步合并成了一步,不如stack()来得直接高效。

内容的提问来源于stack exchange,提问作者johnchase

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:42:22