如何将DataFrame指定年份行转为单行并填充NaN值
Pandas DataFrame 数据处理解决方案
需求
- 筛选2020年的数据
- 将筛选后的数据按时间排序转为单行
- 用前一日的值填充NaN
示例数据
import pandas as pd import numpy as np df = pd.DataFrame() df['day'] = ['2020-01-01', '2019-01-01', '2020-01-02','2020-01-03', '2018-01-01', '2020-01-15','2020-03-01', '2020-02-01', '2017-01-01'] df['value_1'] = [1, np.nan, 32, 48, 5, -1, 5,10,2] df['value_2'] = [np.nan, 121, 23, 34, 15, 21, 15, 12, 39]
期望输出
_1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 0 1 121 1 23 48 34 -1 21 10 12 -1 21
尝试过的无效代码
val_cols = df.filter(like='value_').columns output = (df.pivot('day', val_cols).groupby(level=0, axis=1).apply(lambda x:x.ffill(axis=1).bfill(axis=1)).sort_index(axis=1, level=1))
解决方案代码
# 1. 转换日期列为datetime类型,方便后续年份筛选和排序 df['day'] = pd.to_datetime(df['day']) # 2. 对全量数据按日期排序,确保前向填充能获取到最早的历史有效数据 df_sorted = df.sort_values('day').reset_index(drop=True) # 3. 用前向填充(ffill)处理NaN,自动用前一行(前一日)的对应列值填充 df_filled = df_sorted.ffill() # 4. 筛选2020年的数据 df_2020 = df_filled[df_filled['day'].dt.year == 2020] # 5. 按日期重新排序后,将value列转为扁平化单行 df_2020_sorted = df_2020.sort_values('day')[['value_1', 'value_2']] output = df_2020_sorted.unstack().to_frame().T # 6. 重命名列名匹配需求格式 output.columns = [f'_{i+1}' for i in range(len(output.columns))] print(output)
代码说明
- 日期预处理:将
day转为datetime类型,是年份筛选、时间排序的基础;先对全量数据排序,能解决2020年首日NaN无前置数据的填充问题。 - NaN填充:
ffill()按列填充,严格遵循“用前一日的值填充”的需求逻辑。 - 转单行处理:通过
unstack()将多行的value列转为单行结构,最后重命名列名达到期望格式。
注意:你的期望输出中部分值(如_3、_11、_12)与逻辑处理结果不符,可能存在示例输出笔误,上述代码严格按需求输出正确结果。
内容的提问来源于stack exchange,提问作者Sadcow
相关产品推荐
相关产品推荐

