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

Pandas中将多列融合为单列:melt方法输出不符合预期的解决问询

解决Pandas多列融合为单列的问题

我来帮你搞定这个问题~你用pd.melt()得到的是标准的宽表转长表结果,但还需要一步筛选/聚合来得到你想要的格式。这里有两种实用的方法:

方法一:基于melt后分组聚合

先通过melt把宽表转成长表,再按key分组,提取每个分组里非'None'的有效值(如果全是'None'则保留'None'):

import pandas as pd

# 原始数据
d = {'key': [1,2,3,4,5], 'a': ['None','a', 'None','None','None'], 'b': ['None','None','b','None','None'],'c':['None','None','None','c','c']}
df = pd.DataFrame(d)

# 执行melt转换
melted_df = df.melt(id_vars=['key'], value_name='letter')

# 按key分组,提取每个组的有效字母
result = melted_df.groupby('key')['letter'].apply(
    lambda x: x[x != 'None'].iloc[0] if (x != 'None').any() else 'None'
).reset_index()

print(result)

输出结果:

key letter
0    1   None
1    2      a
2    3      b
3    4      c
4    5      c

方法二:直接在原数据上提取有效值

把字符串'None'替换为Pandas的缺失值类型pd.NA,再通过bfill(从左到右填充缺失值)提取每行的第一个有效值,最后转换回'None':

import pandas as pd

# 原始数据
d = {'key': [1,2,3,4,5], 'a': ['None','a', 'None','None','None'], 'b': ['None','None','b','None','None'],'c':['None','None','None','c','c']}
df = pd.DataFrame(d)

# 将字符串'None'替换为pd.NA
df.replace('None', pd.NA, inplace=True)

# 从a、b、c列中提取每行的第一个非缺失值
df['letter'] = df[['a', 'b', 'c']].bfill(axis=1).iloc[:, 0]

# 将缺失值重新替换为'None'
df['letter'] = df['letter'].fillna('None')

# 保留需要的列
result = df[['key', 'letter']]

print(result)

这个方法不需要转长表,直接在原数据上操作,数据量较大时效率会更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:37:36