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

