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

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

代码说明

  1. 日期预处理:将day转为datetime类型,是年份筛选、时间排序的基础;先对全量数据排序,能解决2020年首日NaN无前置数据的填充问题。
  2. NaN填充:ffill()按列填充,严格遵循“用前一日的值填充”的需求逻辑。
  3. 转单行处理:通过unstack()将多行的value列转为单行结构,最后重命名列名达到期望格式。

注意:你的期望输出中部分值(如_3、_11、_12)与逻辑处理结果不符,可能存在示例输出笔误,上述代码严格按需求输出正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:01:02