2016-12-06 17 views
1

私はこのようになりますデータフレーム持っている:最初の列は、ユーザIDで、2番目の列は日付(その結果であるパンダDATAFRAME補間/再サンプリング毎日のデータを

userid  date   count 
a   2016-12-01 4 
a   2016-12-03 5 
a   2016-12-05 1 
b   2016-11-17 14 
b   2016-11-18 15 
b   2016-11-23 4 

をgroupby(pd.TimeGrouper( 'd'))から3番目のカラムは日々のカウントですが、ユーザごとに、ユーザの最小値と最大値の間に欠けている日数が0になるようにしたいと思います上記のようなデータフレームから始めれば、次のようなデータフレームになります。

userid  date   count 
    a   2016-12-01 4 
    a   2016-12-02 0 
    a   2016-12-03 5 
    a   2016-12-04 0 
    a   2016-12-05 1 
    b   2016-11-17 14 
    b   2016-11-18 15 
    b   2016-11-19 0 
    b   2016-11-20 0 
    b   2016-11-21 0 
    b   2016-11-22 0 
    b   2016-11-23 4 

私はパンダのデータフレームでリサンプリング(前方、後方、平均を補間するために選択するオプションがあります)がありますが、上記の意味でこれをどのようにして行うのですか。各ユーザーIDが、ユーザーごとに時系列の日付が異なる場合ここで

が、私はそれが働いていないしようとしたものです:

grouped_users = user_daily_counts.groupby('user').set_index('timestamp').resample('d', fill_method = None)

ただし、これはエラーAttributeError: Cannot access callable attribute 'set_index' of 'DataFrameGroupBy' objects, try using the 'apply' methodをスローします。私はしたいと思うようにすべての列を転送しながら、私はどのようにapplyメソッドを使用することができるだろうか分かりません。

ありがとうございました!

答えて

3

groupbyresampleを使用できますが、最初にをset_indexで作成する必要があります。
need pandas 0.18.1 and higher

そしてfillnaasfreqによって0によってNaNを埋めます。

最終削除列useridreset_index

df = df.set_index('date') 
     .groupby('userid') 
     .resample('D') 
     .asfreq() 
     .fillna(0) 
     .drop('userid', axis=1) 
     .reset_index() 

print (df) 
    userid  date count 
0  a 2016-12-01 4.0 
1  a 2016-12-02 0.0 
2  a 2016-12-03 5.0 
3  a 2016-12-04 0.0 
4  a 2016-12-05 1.0 
5  b 2016-11-17 14.0 
6  b 2016-11-18 15.0 
7  b 2016-11-19 0.0 
8  b 2016-11-20 0.0 
9  b 2016-11-21 0.0 
10  b 2016-11-22 0.0 
11  b 2016-11-23 4.0 

に列のDTYPEがcount整数astypeを追加したい場合は、次の

df = df.set_index('date') \ 
     .groupby('userid') \ 
     .resample('D') \ 
     .asfreq() \ 
     .fillna(0) \ 
     .drop('userid', axis=1) \ 
     .astype(int) \ 
     .reset_index() 

print (df) 
    userid  date count 
0  a 2016-12-01  4 
1  a 2016-12-02  0 
2  a 2016-12-03  5 
3  a 2016-12-04  0 
4  a 2016-12-05  1 
5  b 2016-11-17  14 
6  b 2016-11-18  15 
7  b 2016-11-19  0 
8  b 2016-11-20  0 
9  b 2016-11-21  0 
10  b 2016-11-22  0 
11  b 2016-11-23  4 
+0

ありがとう!私はset_indexを並べ替えることは考えていませんでしたが、実際には、重複した日付があるのに何らかの形でインデックスを設定しているという意味で私は常に混乱していますか? – helloB

+0

はい、グループごとに一意である必要があります。受け入れていただきありがとうございます。 – jezrael

関連する問題