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
相关产品推荐
相关产品推荐

