如何转换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
相关产品推荐
相关产品推荐

