2017-05-06 118 views
3

我有一個類似這樣的數據集,其中某些年份的數據缺失。熊貓 - 在時間序列數據中添加缺失年份

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,但這也沒有奏效。

我該如何解決這個問題?

回答

5

做一個多指標,因此您不必重複:

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

然後構建一個完整的多指標與所有的組合:

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

然後重新索引:

df.reindex(index) 

的MultiIndex的構建未經測試,可能需要稍微調整(例如,如果一年完全沒有所有的縣),但我認爲你明白了。

+0

我所以用這個! – piRSquared

2

您可以使用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當然不可能! –

1

或者你可以嘗試一些魔法: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() 
2

我正在假設您可能希望在最小和最大年份之間添加所有年份。可能出現這種情況,您在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 
1

你提到你已經試圖加入到一個空白的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