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

如何将Pandas多列数据合并为单个Series并保留NaN

Pandas 自动化合并多年体重数据为单个Series

问题背景

我有5年的体重数据,第一列为月日日期,后续各列对应不同年份的每日体重。已处理好日期列,需要把多列体重数据合并成单个Series来绘制完整图表。试过pd.concat、.join、.merge、melt、stack、agg这些方法都没成功,关键是要自动化流程——不用手动指定列名(比如id_vars="2018"),以后新增年份数据时不用改代码。

示例数据转换需求

原数据

0    1
0  1  4.0
1  2  NaN
2  3  6.0

转换后目标数据

0
0  1
1  2
2  3
3  4
4  NaN
5  6.0

自动化解决方案

方案1:保留日期与体重的对应关系(适合时序图表)

如果需要保留每个体重值对应的日期,用stack()自动堆叠所有年份列:

import pandas as pd
import numpy as np

# 模拟你的原始数据:第一列为日期,后续是各年份体重
weight_df = pd.DataFrame({
    '日期': ['01-01', '01-02', '01-03'],
    '2018': [65.0, 64.8, 64.5],
    '2019': [66.2, np.nan, 65.8],
    '2020': [64.9, 64.7, 64.3]
})

# 自动排除日期列,堆叠所有年份列成单个Series
merged_series = weight_df.drop(columns=['日期']).stack().reset_index(drop=True)

print(merged_series)
  • 逻辑:drop(columns=['日期'])自动过滤掉日期列,剩下的所有年份列都会被处理,新增年份列时代码无需修改
  • stack()把多列数据纵向堆叠,reset_index(drop=True)清除多余索引,得到连续的单个Series

方案2:仅按列顺序合并所有值(完全匹配示例转换)

如果不需要日期对应关系,只是单纯把每列的体重值按顺序拼接(先第一列所有值,再第二列,以此类推),用ravel('F')按列优先展开:

# 按列顺序合并所有体重值(和示例转换结果一致)
merged_series = pd.Series(weight_df.drop(columns=['日期']).values.ravel('F'))

print(merged_series)

你的示例代码修正

你原来的pd.concat是按列合并成DataFrame,不是Series,修正后可以直接得到目标结果:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'2018': [1, 2, 3]})
df2 = pd.DataFrame({'2019': [4, np.NaN, 6]})

# 自动化合并为单个Series,无需指定列名
merged_series = pd.Series(pd.concat([df1, df2], axis=1).values.ravel('F'))

print(merged_series)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:05:20