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

如何按Date匹配列名提取DataFrame对应列值生成新列?

问题描述

现有如下结构的DataFrame:

Date  20180601T32  20180604T33  20180605T32  20180610T33
0 2018-06-04         0.1         0.5          4.5          NaN
1 2018-06-05         1.5         0.2          NaN          0.0
2 2018-06-07         1.1         1.6          NaN          NaN
3 2018-06-10         0.4         1.1          0.0          0.3

需要根据每行的Date列值,匹配列名前缀(比如2018-06-04对应列名前缀20180604),提取对应列的数值到新列Obs。之前尝试用bfill方法:

coalsece_columns = ['20180601', '20180604', '20180605', '20180610'] 
df['obs'] = df[coalesce_columns].bfill(axis=1).iloc[:,0]

但该方法会选取行中第一个非空值,不符合需求。期望输出如下:

Date  20180601T32  20180604T33  20180605T32  20180610T33  Obs
0 2018-06-04         0.1         0.5          4.5          NaN  0.5
1 2018-06-05         1.5         0.2          1.7          0.0  1.7
2 2018-06-07         1.1         1.6          NaN          NaN  NaN
3 2018-06-10         0.4         1.1          0.0          0.3  0.3
解决办法

步骤1:预处理日期格式

先确保Date列为datetime类型,并生成与列名前缀一致的YYYYMMDD格式字符串:

import pandas as pd

# 转换Date列为datetime类型(若原始数据是字符串格式)
df['Date'] = pd.to_datetime(df['Date'])
# 生成匹配列名前缀的日期字符串
date_matches = df['Date'].dt.strftime('%Y%m%d')

步骤2:匹配列名并提取目标值

通过重命名数据列的前缀,利用lookup方法快速提取每行对应日期的列值:

# 提取所有数据列的前缀,建立前缀到列名的映射
data_cols = df.columns.drop('Date')
prefix_col_map = {col.split('T')[0]: col for col in data_cols}

# 重命名数据列为前缀,方便后续匹配
temp_df = df[data_cols].rename(columns=prefix_col_map)

# 提取每行对应日期前缀的数值,生成Obs列
df['Obs'] = temp_df.lookup(df.index, date_matches)

该方法采用矢量化操作,效率比逐行apply更高,且能准确匹配每行Date对应的列值,无匹配项时自动返回NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:45:15