Pandas Dataframe .loc + 更新非唯一日期时间索引?

Posted

技术标签:

【中文标题】Pandas Dataframe .loc + 更新非唯一日期时间索引?【英文标题】:Pandas Dataframe .loc + update on a non-unique Datetime Index? 【发布时间】:2021-12-08 23:59:44 【问题描述】:

有一个带有时间戳 (%Y-%m-%d) 索引的 DataFrame,我希望能够使用 .loc 在知道日期时间索引值的情况下更新单行。

我知道索引是非唯一的,这意味着有时我会得到的不仅仅是我想要更新的行。所以我在第二列对 DataFrame 进行了排序,这样我要更新的行将始终是该索引值的最后一行。

有问题的 DataFrame 是一个更大的 DataFrame 的子集副本,并且在不使用 .loc 的情况下设置值不起作用 - 因此我限制使用 .loc

我的问题:有没有办法可以引用索引值的最后一行并更新它,完全基于索引?

显然,仅使用索引值将使用该索引更新所有行,argmax 似乎不适用于时间戳,虽然我可以临时重新创建索引以使用我排序的另一列,但我宁愿不使用它如果有直接的方法,三步解决方案。

请参阅下面的代码以获取示例 DataFrame - 我所追求的是一种仅使用 df['sort']=='d' 更新行的方法,我知道这将是索引的最后一个,仅基于索引值,如果这样可能。

l1 = [datetime.today().date()] * 4
l2 = list(range(1,5))
l3 = ['a','b','c','d']
df= pd.DataFrame(list(zip(l1,l2,l3)),columns=['datetime','value','sort'])
df.set_index('datetime',inplace=True)

df
Out[1317]: 
            value sort
datetime              
2021-10-22      1    a
2021-10-22      2    b
2021-10-22      3    c
2021-10-22      4    d

df.loc[df.index[-1].argmax()]
Traceback (most recent call last):

  File "<ipython-input-1318-e1758b122814>", line 1, in <module>
    df.loc[df.index[-1].argmax()]

AttributeError: 'datetime.date' object has no attribute 'argmax'

df.loc[df.index[-1],'value'] = 5

df
Out[1320]: 
            value sort
datetime              
2021-10-22      5    a
2021-10-22      5    b
2021-10-22      5    c
2021-10-22      5    d

【问题讨论】:

【参考方案1】:

如果你想改变数据框最后一行的特定列的值,你可以试试下面的代码

df.iloc[-1,0] = 5

-1 -> 数据框的最后一行

0 -> 列“值”的索引

【讨论】:

谢谢 Udaya,它为我解决了这个问题——我在这里错过的是我不能将行索引与列名结合起来——两者都需要索引。我现在可以在列名上使用 get_loc 来解决这个问题,只是为了保持水密。【参考方案2】:

基于Udaya的answer above,我需要的解决方案是:

df.iloc[-1, df.columns.get_loc('value')] = 5

【讨论】:

以上是关于Pandas Dataframe .loc + 更新非唯一日期时间索引?的主要内容,如果未能解决你的问题,请参考以下文章

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

python:pandas之DataFrame取行列(df.loc(),df.iloc())以及索引

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

Pandas笔记 · DataFrame.loc()和DataFrame.iloc()

Pandas笔记 · DataFrame.loc()和DataFrame.iloc()

Pandas笔记 · DataFrame.loc()和DataFrame.iloc()