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

如何在含非唯一DateTimeIndex的Pandas DataFrame中修改指定日期列值

问题解决:修改指定日期的Pandas DataFrame列值

原始DataFrame

DATE          delivery
2020-01-01     1
2020-01-01    11
2020-01-01    10
2020-01-01     9
2020-01-01     8
              ..
2023-03-02     5
2023-03-02     4
2023-03-02     3
2023-03-02     2
2023-03-02    11

该DataFrame的索引为非唯一DateTimeIndex,需求是修改列表date_adj中包含的日期对应的delivery列值(符合条件的行的delivery值加1)。

错误代码及报错

尝试的代码:

for i in date_adj:
    for x in range(1,11):
        df.loc[((df.index == i) & (df.delivery == x)), 
                     [df.delivery]] = (df.delivery + 1)

报错信息:

KeyError: "None of [Index([(1, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 6, 9, 8, 7, 5, 4, 3, 2, 10, 11, 4, 1, 5, 6, 7, 8, 1, 9, 10, 11, 3, 2, 2, 7, 3, 4, 5, 6, 8, 9, 10, 11, 1, 1, 3, 4, 5, 6, 7, 8, 9, 10, 2, 11, 2, 4, 5, 6, 7, 8, 9, 10, 11, 3, 11, 10, 9, 8, 7, 2, 5, 4, 3, 1, 2, 6, 1, 3, 7, 4, 5, 6, 8, 10, 11, 9, 4, 9, 8, 7, 6, 5, 4, 3, 1, 5, 11, 9, ...)], dtype='object')] are in the [columns]"

期望效果

若date_adj包含'2023-03-02',修改后结果如下:

DATE          delivery
2020-01-01     1
2020-01-01    11
2020-01-01    10
2020-01-01     9
2020-01-01     8
              ..
2023-03-02     6
2023-03-02     5
2023-03-02     4
2023-03-02     3
2023-03-02    12

问题分析与解决方案

错误原因

  1. loc的列参数使用了[df.delivery],这是一个Series对象而非列名字符串,导致Pandas无法识别目标列,触发KeyError。
  2. 嵌套循环冗余且效率低下,无需遍历数字范围匹配行数据。

正确代码

直接通过索引筛选指定日期,对匹配行的delivery列值加1即可:

import pandas as pd

# 若date_adj中的元素是字符串,先转换为datetime类型
date_adj = pd.to_datetime(date_adj)
# 筛选索引在目标日期列表中的行,修改delivery值
df.loc[df.index.isin(date_adj), 'delivery'] += 1

说明

  • df.index.isin(date_adj)会直接匹配所有属于目标日期的行,无需嵌套循环。
  • 'delivery'是明确的列名字符串,避免列识别错误。
  • 若date_adj中的元素已经是datetime类型,可跳过pd.to_datetime转换步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:12:07