根据日期列表,在Pandas DataFrame中使用DateTime索引替换值

3

我有一个数据框和一个日期列表。例如,

data = pd.DataFrame([1,3,5,7,2,3,9,1,3,8,4,5],index=pd.date_range(start='2017-01-01',periods=12),columns=['values'])

我想用零值替换日期列表中的日期值。例如:

date_list = ['2017-01-04', '2017-01-07', '2017-01-10']

我已经尝试过:

data[date_list] == 0

但是这会产生一个错误:

KeyError: "None of [['2017-01-04', '2017-01-07', '2017-01-10']] are in the [index]"

有人知道如何解决这个问题吗?我有一个非常大的数据框和日期列表...

2个回答

4

另一种方法是,

In [11]: data[data.index.isin(date_list)] = 0

In [12]: data
Out[12]:
            values
2017-01-01       1
2017-01-02       3
2017-01-03       5
2017-01-04       0
2017-01-05       2
2017-01-06       3
2017-01-07       0
2017-01-08       1
2017-01-09       3
2017-01-10       0
2017-01-11       4
2017-01-12       5

2

您需要将该列表转换为日期时间并使用loc索引器:

data.loc[pd.to_datetime(date_list)] = 0

data
Out[19]: 
            values
2017-01-01       1
2017-01-02       3
2017-01-03       5
2017-01-04       0
2017-01-05       2
2017-01-06       3
2017-01-07       0
2017-01-08       1
2017-01-09       3
2017-01-10       0
2017-01-11       4
2017-01-12       5

这个方法可以成功是因为DataFrame只有一列。这会将所有列的值都设置为零。但正如jezrael所指出的,如果你只想将values列的值设置为零,你需要指定:

data.loc[pd.to_datetime(date_list), 'values'] = 0

在我看来更好的解决方案,也许是如果需要指定列,则可以使用 data.loc[pd.to_datetime(date_list), 'values'] = 0 - jezrael
@jezrael 哦,是的,我经常犯那个错误。谢谢。 - ayhan
1
不,我认为如果需要替换所有列,您的解决方案是可以的。这取决于 OP ;) - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接