如何将Pandas多列合并为指定单列?求可行解决方案
解决Pandas多列合并为单列(提取每行有效值)的问题
嘿,我明白你的需求了——你想把每行里唯一的日期值提取出来放到新的Day列,没有有效值的行就返回None。你之前用melt的思路其实偏了,因为melt是用来把宽表转成长表的,所以才会生成一堆多余的行。下面给你两种简单高效的实现方法:
方法一:逐行提取有效值(直观易懂)
首先我们先把DataFrame里的字符串'None'替换成Pandas的缺失值pd.NA,这样更容易处理空值。然后用apply逐行筛选出非缺失的值,没有的话就返回None:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame({ 'Monday': {0: 'Monday', 1: 'None', 2: 'None'}, 'Tuesday': {0: 'None', 1: 'None', 2: 'Tuesday'}, 'Wednesday': {0: 'None', 1: 'None', 2: 'None'} }) # 替换字符串'None'为Pandas缺失值 df_clean = df.replace('None', pd.NA) # 逐行提取非缺失值,无有效值则返回None df_clean['Day'] = df_clean.apply( lambda row: row.dropna().iloc[0] if not row.dropna().empty else None, axis=1 ) # 只保留Day列的结果 result = df_clean[['Day']] print(result)
运行后输出就是你想要的:
Day 0 Monday 1 None 2 Tuesday
方法二:用填充方法实现(更高效)
如果你的数据集比较大,apply的效率可能不够高,这时候可以用bfill(向后填充)结合轴方向来实现。因为每行只有一个有效值,向后填充会把这个值填充到该行的所有列,我们只需要取第一列就行:
import pandas as pd df = pd.DataFrame({ 'Monday': {0: 'Monday', 1: 'None', 2: 'None'}, 'Tuesday': {0: 'None', 1: 'None', 2: 'Tuesday'}, 'Wednesday': {0: 'None', 1: 'None', 2: 'None'} }) df_clean = df.replace('None', pd.NA) # 按行向后填充,然后取第一列作为Day列 df_clean['Day'] = df_clean.bfill(axis=1).iloc[:, 0] result = df_clean[['Day']] print(result)
这个方法和上面的结果完全一致,但运行速度更快,适合处理大数据量的情况。
为什么你的melt方法不行?
pd.melt()的作用是把宽格式的DataFrame转换为长格式,它会把每一列的每一行都拆成单独的行,所以才会生成12行的结果。如果一定要用melt的话,你需要后续再按原行号分组,提取非None的值,但这样做绕了远路,不如上面两种方法直接。
内容的提问来源于stack exchange,提问作者MBasith
相关产品推荐
相关产品推荐

