Pandas根据指定日期-公司列表从源DataFrame取值构建新DataFrame
问题背景
- 现有三层嵌套列表存储公司标识与对应需提取数据的日期集合,示例格式:
[[['14-Sep-20'], 'a'], [['10-Jan-20','21-May-21'], 'b'], [['10-Jan-20'], 'c'], [['25-Feb-21'], 'd']] - 源数据为DataFrame
df1:行索引为2020年1月1日至今的所有日期,列覆盖a-z所有公司,单元格存储对应日期对应公司的数值。 - 构建新DataFrame的需求:
- 行索引取嵌套列表中出现的所有日期
- 列取嵌套列表涉及的所有公司
- 仅填充列表明确指定的「日期-公司」组合对应的
df1数值,其余位置留空
- 已尝试方案的问题:
- 手动构造字典传入
pandas.DataFrame的方式需要手动录入单元格值,无法自动从df1拉取数据,不符合要求 - 参考其他方案实现后新表行列结构正确,但所有单元格均为
NaN,无法正确读取源表数值
- 手动构造字典传入
解决方案
新表全为NaN的核心原因是索引匹配失败:pandas的loc取值是严格全等匹配,若df1的行索引是datetime64类型,和列表中'14-Sep-20'格式的字符串类型日期无法匹配,自然返回空值。
完整可运行实现代码如下:
import pandas as pd import numpy as np # 第一步:统一df1行索引格式,和列表中的日期字符串格式对齐 # 如果df1索引本身就是'd-%b-%y'格式的字符串,可跳过此步 df1.index = df1.index.strftime('%d-%b-%y') # 第二步:解析嵌套列表,提取所有目标日期、目标公司,以及日期-公司对应关系 nested_list = [[['14-Sep-20'], 'a'], [['10-Jan-20','21-May-21'], 'b'], [['10-Jan-20'], 'c'], [['25-Feb-21'], 'd']] # 替换为实际列表变量 company_date_map = {} all_target_dates = set() all_target_companies = set() for date_group, company in nested_list: company_date_map[company] = date_group all_target_dates.update(date_group) all_target_companies.add(company) # 第三步:初始化全空的目标DataFrame result_df = pd.DataFrame( index=list(all_target_dates), # 需要按日期排序可改成sorted(all_target_dates) columns=list(all_target_companies), dtype=np.float64 ) # 第四步:批量从df1取值填充,避免逐单元格循环 for company, valid_dates in company_date_map.items(): result_df.loc[valid_dates, company] = df1.loc[valid_dates, company]
排查提示:若运行后仍有部分单元格为
NaN,先校验对应日期是否真实存在于df1.index中,不存在的日期无法取到有效值。
内容的提问来源于stack exchange,提问作者Younglad
相关产品推荐
相关产品推荐

