如何无需删除空值将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
相关产品推荐
相关产品推荐

