Pandas-在重复年份的时间序列数据中添加缺失的年份

ks2*_*882 4 python time-series missing-data pandas reindex

我有一个这样的数据集,其中缺少数年的数据.

County Year Pop
12     1999 1.1
12     2001 1.2
13     1999 1.0
13     2000 1.1
Run Code Online (Sandbox Code Playgroud)

我想要类似的东西

County Year Pop
12     1999 1.1
12     2000 NaN
12     2001 1.2
13     1999 1.0
13     2000 1.1
13     2001 nan
Run Code Online (Sandbox Code Playgroud)

我已经尝试将索引设置为年份,然后使用reindex与另一个仅几年的数据框架方法(这里提到的Pandas:添加缺失月份的数据)但它给了我错误cant reindex重复值.我也试过df.loc,但它有同样的问题.我甚至尝试了一个完整的外部连接,只有几年的空白df,但这也没有用.

我怎么解决这个问题?

Joh*_*nck 7

创建一个MultiIndex,这样就不会有重复项:

df.set_index(['County', 'Year'], inplace=True)
Run Code Online (Sandbox Code Playgroud)

然后用所有组合构造一个完整的MultiIndex:

index = pd.MultiIndex.from_product(df.index.levels)
Run Code Online (Sandbox Code Playgroud)

然后重新索引:

df.reindex(index)
Run Code Online (Sandbox Code Playgroud)

MultiIndex的构造未经测试,可能需要稍微调整(例如,如果所有县完全没有一年),但我认为你明白了.


piR*_*red 5

我假设您可能想要添加最小年份和最大年份之间的所有年份。您可能缺少 Counties12和的 2000 13

我将pd.MultiIndex from_product使用unique该列中的值'County'以及该列中最小年份和最大年份之间(包括该年份)的所有整数年份来构造一个'Year'

注意:此解决方案会填充所有缺失的年份,即使它们当前不存在。

mux = pd.MultiIndex.from_product([
        df.County.unique(),
        range(df.Year.min(), df.Year.max() + 1)
    ], names=['County', 'Year'])

df.set_index(['County', 'Year']).reindex(mux).reset_index()

   County  Year  Pop
0      12  1999  1.1
1      12  2000  NaN
2      12  2001  1.2
3      13  1999  1.0
4      13  2000  1.1
5      13  2001  NaN
Run Code Online (Sandbox Code Playgroud)