我有一个带有时间戳索引和大约 100,000 行的 DataFrame。通过
df['year'] = df.index.year
创建一个包含每一行年份的新列很容易。现在我想找出我的时间序列中缺少哪些年份。到目前为止,我明白我可以使用 groupby 来获得“东西”,让我找到独特的值(value)。因此,
grouped = df.groupby('year')
grouped.groups.keys()
会给我数据集中存在的年份。我现在可以用
构建一个完整的年份向量
pd.date_range(df.index.min(), df.index.max(), freq='AS')
然后通过重建索引,我应该能够找到缺失的年份,因为这些年份具有 NaN 值。
然而,对于这样一个看似简单的任务来说,这听起来非常复杂,而 grouped.groups 操作实际上需要相当长的时间;大概是因为它不仅查找唯一键,而且还构建属于每个键的行的索引列表,这是我在这里不需要的功能。
有什么方法可以更直接/高效地获取dataframe列的唯一元素吗?
一种方法是构建一系列感兴趣的年份,然后使用 isin
查看缺失值:
In [89]:
year_s = pd.Series(np.arange(1993, 2015))
year_s
Out[89]:
0 1993
1 1994
2 1995
3 1996
4 1997
5 1998
6 1999
7 2000
8 2001
9 2002
10 2003
11 2004
12 2005
13 2006
14 2007
15 2008
16 2009
17 2010
18 2011
19 2012
20 2013
21 2014
dtype: int32
In [88]:
df = pd.DataFrame({'year':[1999, 2000, 2013]})
df
Out[88]:
year
0 1999
1 2000
2 2013
In [91]:
year_s[~year_s.isin(df['year'])]
Out[91]:
0 1993
1 1994
2 1995
3 1996
4 1997
5 1998
8 2001
9 2002
10 2003
11 2004
12 2005
13 2006
14 2007
15 2008
16 2009
17 2010
18 2011
19 2012
21 2014
dtype: int32
因此,在您的情况下,您可以生成上述年份系列,然后对于您的 df,您可以使用以下方法获取年份:
df.index.year.unique()
这比执行 groupby
快得多。
注意传递给 arange
的最后一个值不包含在范围内
我是一名优秀的程序员,十分优秀!