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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:03:26