2016-05-25 4 views
2

は、我々は次のデータフレームがあるとします。私は最後にしたいと思い何パンダ:各組み合わせが存在するようにデータフレームを再サンプリングする方法は?

# data 
t = pd.to_datetime(pd.Series(['2015-01-01', '2015-02-01', '2015-03-01', '2015-04-01', '2015-01-01', '2015-02-01'])) 
g = pd.Series(['A', 'A', 'A', 'A', 'B', 'B']) 
v = pd.Series([12.1, 14.2, 15.3, 16.2, 12.2, 13.7]) 
df = pd.DataFrame({'time': t, 'group': g, 'value': v}) 

# show data 
>>> df 
     time group value 
0 2015-01-01 A  12.1 
1 2015-02-01 A  14.2 
2 2015-03-01 A  15.3 
3 2015-04-01 A  16.2 
4 2015-01-01 B  12.2 
5 2015-02-01 B  13.7 

は、次のデータフレームである:

>>> df 
     time group value 
0 2015-01-01 A  12.1 
1 2015-02-01 A  14.2 
2 2015-03-01 A  15.3 
3 2015-04-01 A  16.2 
4 2015-01-01 B  12.2 
5 2015-02-01 B  13.7 
6 2015-03-01 B  13.7 
7 2015-04-01 B  13.7 

グループBで行方不明の観測を追加する必要がありますし、欠損値は、最後に観測された値をデフォルトにする必要があります。

どうすればこの問題を解決できますか?前もって感謝します!

答えて

1

あなたは、再形成のためのpivotを使用ffillNaN(法ffillfillna)とreset_indexunstackによって元に再構築することができます

print (df.pivot(index='time',columns='group',values='value') 
     .ffill() 
     .unstack() 
     .reset_index(name='value')) 

    group  time value 
0  A 2015-01-01 12.1 
1  A 2015-02-01 14.2 
2  A 2015-03-01 15.3 
3  A 2015-04-01 16.2 
4  B 2015-01-01 12.2 
5  B 2015-02-01 13.7 
6  B 2015-03-01 13.7 
7  B 2015-04-01 13.7 

別の解決策を最初timeminによってdate_rangemax値を見つけます。その後ffillDによってresamplegroupby

お知らせ:

私は最後の数がmonthある場合は、to_datetimeでパラメータformat='%Y-%d-%m'を忘れると思う:

t = pd.to_datetime(pd.Series(['2015-01-01', '2015-02-01', '2015-03-01', 
           '2015-04-01', '2015-01-01', '2015-02-01']), 
        format='%Y-%d-%m') 


idx = pd.date_range(df.time.min(), df.time.max()) 
print (idx)  
DatetimeIndex(['2015-01-01', '2015-01-02', '2015-01-03', '2015-01-04'], 
dtype='datetime64[ns]', freq='D') 

df1 = (df.groupby('group') 
     .apply(lambda x: x.set_index('time') 
     .reindex(idx)) 
     .ffill() 
     .reset_index(level=0, drop=True) 
     .reset_index() 
     .rename(columns={'index':'time'})) 

print (df1) 

     time group value 
0 2015-01-01  A 12.1 
1 2015-01-02  A 14.2 
2 2015-01-03  A 15.3 
3 2015-01-04  A 16.2 
4 2015-01-01  B 12.2 
5 2015-01-02  B 13.7 
6 2015-01-03  B 13.7 
7 2015-01-04  B 13.7 
+0

感謝を!また、2つのソリューションを提供します。 – Michael

関連する問題