如何在含非唯一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
问题分析与解决方案
错误原因
loc的列参数使用了[df.delivery],这是一个Series对象而非列名字符串,导致Pandas无法识别目标列,触发KeyError。- 嵌套循环冗余且效率低下,无需遍历数字范围匹配行数据。
正确代码
直接通过索引筛选指定日期,对匹配行的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
相关产品推荐
相关产品推荐

