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

