奇怪的 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
我在尝试使用 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