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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:23:19