2017-05-06 9 views
3

私は、このようなデータセットを数年間失っています。パンダ - 重複年を含む時系列データに年がない場合を追加します。

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

私は年にインデックスを設定しようとした後、(ここではPandas: Add data for missing months言及した)だけで年間方法の他のデータフレームとREINDEX使用していますが、エラーが重複してインデックスを再作成カント私を与えている

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 

ような何かをしたいです値。私もdf.locを試しましたが、同じ問題があります。私はちょうど何年ものブランクdfで完全な外部結合を試しましたが、それはまた仕事をしませんでした。

どうすればこの問題を解決できますか?

答えて

5

あなたが重複していないので、マルチインデックスを作成します。

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

はその後、すべての組み合わせで、完全なマルチインデックスを構築:次に

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

は、インデックスを再作成:

df.reindex(index) 

MultiIndexの構築はテストされておらず、少し微調整が必​​要な場合があります(例えば、1年がすべての郡)、私はあなたが考えを得ると思います。

+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

こんにちはAndy!私はあなたの前にあなたに質問に答えたとは思わない: – piRSquared

+0

@piRSは確かに不可能だ! –

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

を私は、あなたが最小年と最大年の間にすべての年を追加したいという前提の下で働いています。 county 1213の両方で2000年が失われている場合があります。

私はunique'County'列の値とすべての整数の年の間を使用して'Year'欄の最小値と最大値の年を含むpd.MultiIndexfrom_productを構築します。

注:このソリューションは、現在存在していなくてもすべての不足年を埋めます。

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

関連する問題