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

如何转换Pandas DataFrame列名为单列并提取有效非空数据

Pandas DataFrame列转行提取有效值解决方案

原数据示例

创建原DataFrame的代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({'apple': [np.nan, 'Bad', 'Good'], 'banana': [np.nan, np.nan, np.nan], 'orange': ['Good', np.nan, np.nan]})

原数据展示:

apple   banana  orange
0   NaN     NaN     Good
1   Bad     NaN     NaN
2   Good    NaN     NaN

需求说明

原DataFrame每行仅存在一个非NaN的Good或Bad值,需要将原列名转为单独的fruit列,提取单元格中的有效值作为result列,目标格式如下:

fruit   result  
0   orange  Good
1   apple   Bad
2   apple   Good

可行解决方案

方法1:使用stack()快速实现

stack()方法会自动过滤NaN值,并保留原索引,是最简洁的实现方式:

# 堆叠列到行,自动丢弃NaN,生成多级索引Series
stacked_series = df.stack()
# 转换为DataFrame并调整列名
result_df = stacked_series.reset_index(name='result').rename(columns={'level_1': 'fruit'})
# 保留目标列
result_df = result_df[['fruit', 'result']]

执行后即可得到目标格式的DataFrame,原索引会被正确保留。

方法2:修正pd.melt的使用方式

如果坚持使用melt,只需补充保留原索引的步骤即可解决之前的问题:

# 先将原索引转为普通列,避免熔解后丢失索引信息
melted_df = df.reset_index().melt(id_vars='index', var_name='fruit', value_name='result')
# 过滤NaN值,恢复原索引并调整格式
result_df = melted_df.dropna(subset=['result']).set_index('index').rename_axis(None)[['fruit', 'result']]

该方法通过先保留原索引列,熔解后再恢复索引,同时过滤无效的NaN值,最终得到符合要求的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:11:20