熊猫 - 在时间序列数据中添加缺失年份

熊猫 - 在时间序列数据中添加缺失年份

问题描述:

我有一个类似这样的数据集,其中某些年份的数据缺失。熊猫 - 在时间序列数据中添加缺失年份

County Year Pop 
12  1999 1.1 
12  2001 1.2 
13  1999 1.0 
13  2000 1.1 

我想是这样

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 

我已经尝试设置指数一年,然后使用重新索引只有几年方法的另一个数据帧(这里提到Pandas: Add data for missing months),但它给我的错误不能重复的重新编制值。我也试过df.loc,但它有同样的问题。我甚至尝试了一个完整的外连接,只用了几年的空白df,但这也没有奏效。

我该如何解决这个问题?

做一个多指标,因此您不必重复:

df.set_index(['County', 'Year'], inplace=True) 

然后构建一个完整的多指标与所有的组合:

index = pd.MultiIndex.from_product(df.index.levels) 

然后重新索引:

df.reindex(index) 

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

+0

我所以用这个! – piRSquared

您可以使用pivot_table

In [11]: df.pivot_table(values="Pop", index="County", columns="Year") 
Out[11]: 
Year 1999 2000 2001 
County 
12  1.1 NaN 1.2 
13  1.0 1.1 NaN 

stack结果(一个系列是必需的):

In [12]: df.pivot_table(values="Pop", index="County", columns="Year").stack(dropna=False) 
Out[12]: 
County Year 
12  1999 1.1 
     2000 NaN 
     2001 1.2 
13  1999 1.0 
     2000 1.1 
     2001 NaN 
dtype: float64 
+0

嗨,安迪!我认为我以前没有回答过你的问题:-) – piRSquared

+0

@piRSquared当然不可能! –

或者你可以尝试一些魔法:P

min_year, max_year = df.Year.min(), df.Year.max() 

df.groupby('County').apply(lambda g: g.set_index("Year").reindex(range(min_year, max_year+1))).drop("County", axis=1).reset_index() 

我正在假设您可能希望在最小和最大年份之间添加所有年份。可能出现这种情况,您在1213两个县都错过了2000年。

我将构建使用pd.MultiIndexfrom_product'County'unique值和所有整数岁之间并包括最小值和最大值年的'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 

你提到你已经试图加入到一个空白的DF,这种方法实际上可以工作。

设置:

df = pd.DataFrame({'County': {0: 12, 1: 12, 2: 13, 3: 13}, 
'Pop': {0: 1.1, 1: 1.2, 2: 1.0, 3: 1.1}, 
'Year': {0: 1999, 1: 2001, 2: 1999, 3: 2000}}) 

解决方案

#create a new blank df with all the required Years for each County 
df_2 = pd.DataFrame(np.r_[pd.tools.util.cartesian_product([df.County.unique(),np.arange(1999,2002)])].T, columns=['County','Year']) 

#Left join the new dataframe to the existing dataframe to populate the Pop values. 
pd.merge(df_2,df,on=['Year','County'],how='left') 
Out[73]: 
    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 
+0

非常感谢,我没有在我的空白df包括县。我现在看到我的错误...谢谢! – ks2882

+0

不客气。 – Allen