2016-05-18 11 views
0

ここでは同様の質問がたくさんありますが、実際には同じdatetimeで観測したものは見つかりませんでした。最小非稼働の例では、次のようになります。パンダは重複したデータセットを持つグループ別に再サンプリングする

df = pd.DataFrame(
    {"Date": np.tile([pd.Series(["2016-01", "2016-03"])], 2)[0], 
    "Group": [1,1,2,2], 
    "Obs":[1,2,5,6]}) 

要求出力が私の理解では、resampleがすべきことである

Date Group Obs 
    2016-01  1  1 
    2016-02  1  1.5 
    2016-03  1  2 
    2016-01  2  5 
    2016-02  2  5.5 
    2016-03  2  6 

あるので、今私は、直線グループによって2016年2月の値を補間したいのですがこれを行うことができます(私の実際のアプリケーションでは、私は四半期から毎月に移動しようとしていますので、1月と4月に観測があります)。しかし、それには何らかの時間インデックスが必要です。 Dateの列。

私はある種のgroupbyの魔法が助けになると思っていますが、それを理解できません!

を使用でき

答えて

1

編集

パンダAPIは、今あなたが使用することができ、(0.18.1)変更されたresampleを置き換えますreindexで2倍の速度向上が得られます。あなたはそれだけでグループ化列の値ごとに1つのデータフレーム(ここではdf1)を返し理解すればgroupbyを使用して

df.set_index('Date', inplace=True) 
index = ['2016-01', '2016-02', '2016-03'] 

df.groupby('Group').apply(lambda df1: df1.reindex(index).interpolate()) 

は簡単です。

+0

であれば、実際のアプリケーションで何らかの理由で日付を月末にシフトします。 2016-01には、2016-01-01ではなく2016-01-31のインデックスがあります) - これがどうして起こるのでしょうか? –

+1

私は同じことに気づいた。 Jezraelの回避策を使用することができます: '.dt.to_period' :) – IanS

+0

それはします。一つの最後のこと:これをスピードアップする方法はありますか?私の実際の例は、〜500k行(月に移動すると1.5mに成長する)であり、グループ化するために4列ありますので、これは私のシステムで数分かかります。 –

2

#convert column Date to datetime 
df['Date'] = pd.to_datetime(df.Date) 
print (df) 
     Date Group Obs 
0 2016-01-01  1 1 
1 2016-03-01  1 2 
2 2016-01-01  2 5 
3 2016-03-01  2 6 

#groupby, resample and interpolate 
df1 = df.groupby('Group').apply(lambda x : x.set_index('Date') 
              .resample('M') 
              .first() 
              .interpolate()) 
         .reset_index(level=0, drop=True).reset_index() 

#convert Date to period 
df1['Date'] = df1.Date.dt.to_period('M') 
print (df1) 
    Date Group Obs 
0 2016-01 1.0 1.0 
1 2016-02 1.0 1.5 
2 2016-03 1.0 2.0 
3 2016-01 2.0 5.0 
4 2016-02 2.0 5.5 
5 2016-03 2.0 6.0 

EDIT:

df['Date'] = pd.to_datetime(df.Date) 
df.set_index('Date', inplace=True) 

df1 = df.groupby('Group').apply(lambda df1: df1.resample('M') 
               .first() 
               .interpolate()) 
         .reset_index(level=0, drop=True).reset_index() 

df1['Date'] = df1.Date.dt.to_period('M') 
print (df1) 
    Date Group Obs 
0 2016-01 1.0 1.0 
1 2016-02 1.0 1.5 
2 2016-03 1.0 2.0 
3 2016-01 2.0 5.0 
4 2016-02 2.0 5.5 
5 2016-03 2.0 6.0 
+0

これは元々の質問ではありませんでしたが、この方法は複数のカテゴリでグループ化すると失敗します(これは最後に行われたインデックスのリセットに関係していると推定しています) –

+0

レベルを追加することができますもしgroupbyが2つのカテゴリ '.reset_index(level = [0,1]、drop = True)' – jezrael

関連する問題