奇怪的 pandas 行为:屏蔽缺失的日期时间索引值会创建重复行

strange pandas behavior: masking missing datetime index values creates duplicate rows

我在尝试使用 pandas.Index.dropna 屏蔽缺少日期时间索引值的行时遇到了一个奇怪的问题。出乎意料的是,仅对 select 非缺失日期时间值应用掩码会导致复制相同索引的行。

这是一个重现问题的小例子 (pandas 1.4.2):

import pandas as pd
dates = ["01-May-2022", "02-May-2022", "02-May-2022", "03-May-2022", "04-May-2022"]
values = [1, 2, 3, 4, 5]
series = pd.Series(values, index=dates)
seriesB = series.loc[series.index.dropna()]

In [28]: series
Out[28]: 
01-May-2022    1
02-May-2022    2
02-May-2022    3
03-May-2022    4
04-May-2022    5
dtype: int64

In [29]: seriesB
Out[29]: 
01-May-2022    1
02-May-2022    2
02-May-2022    3
02-May-2022    2
02-May-2022    3
03-May-2022    4
04-May-2022    5
dtype: int64

有谁知道为什么系列 B 有额外的行?

这是因为您的 Series 调用系列在索引中有重复值 - 即 02-May-2022 所以当您在 .loc[] 中使用相同的值进行查找时,它会匹配两次:

series.loc["02-May-2022"]

02-May-2022    2
02-May-2022    3

如果您在 .loc[] 中有两次查找值,那么它将 return 4 行(2x2 行):

series.loc[["02-May-2022","02-May-2022"]]

02-May-2022    2
02-May-2022    3
02-May-2022    2
02-May-2022    3

.dropna() 对您的示例数据没有影响。

附带说明一下,如果需要,您可以使用 .loc[] 的这种功能来复制值:

series.loc[["01-May-2022","01-May-2022","01-May-2022","01-May-2022"]]

01-May-2022    1
01-May-2022    1
01-May-2022    1
01-May-2022    1

将此视为索引查找而不是屏蔽。


删除 Series 中包含 NA 索引值的行应该会像您预期的那样工作 - 没有重复:

dates = ["01-May-2022", "02-May-2022", np.nan, "03-May-2022", "04-May-2022"]
values = [1, 2, 3, 4, 5]
series = pd.Series(values, index=dates)
series

01-May-2022    1
02-May-2022    2
NaN            3
03-May-2022    4
04-May-2022    5

seriesB = series.loc[series.index.dropna()]
seriesB

01-May-2022    1
02-May-2022    2
03-May-2022    4
04-May-2022    5