2016-06-20 9 views
1

私の目的は、欠落しているデータを以前のデータで置換し、日付を再サンプリングするために、パンダに行を追加することです。 私のデータには異なる製品IDが含まれており、毎回groupByを実行する必要があります。なぜなら、すべてのproductIdの時間セリデータを保持する必要があるからです。 例:パンダと同時にリサンプリングとグループ化を適用するには?

productId popularity converted_timestamp  date 
0  1   5   2015-12-01   2015-12-01 
1  1   8   2015-12-02   2015-12-02 
2  1   6   2015-12-04   2015-12-04 
3  1   9   2015-12-07   2015-12-07 
4  2   5   2015-12-01   2015-12-01 
5  2   10   2015-12-03   2015-12-03 
6  2   6   2015-12-04   2015-12-04 
7  2   12   2015-12-07   2015-12-07 
8  2   11   2015-12-09   2015-12-09 

そして、これは私が欲しいものです:: これが私のデータフレームである

 date  productId popularity converted_timestamp 
0 2015-12-01 1   5   2015-12-01 
1 2015-12-02 1   8   2015-12-02 
2 2015-12-03 1   8   2015-12-02 
3 2015-12-04 1   6   2015-12-04 
4 2015-12-05 1   6   2015-12-04 
5 2015-12-06 1   6   2015-12-04 
6 2015-12-07 1   9   2015-12-07 
7 2015-12-01 2   5   2015-12-01 
8 2015-12-02 2   5   2015-12-01 
9 2015-12-03 2   10   2015-12-03 
10 2015-12-04 2   6   2015-12-04 
11 2015-12-05 2   6   2015-12-04 
12 2015-12-06 2   6   2015-12-04 
13 2015-12-07 2   12   2015-12-07 
14 2015-12-08 2   12   2015-12-07 
15 2015-12-09 2   11   2015-12-09 

そして、これは私のコードです:

df.set_index('date').groupby('productId', group_keys=False).apply(lambda df: df.resample('D').ffill()).reset_index() 

それが動作し、それは完璧です! だから私の新しいデータは、次のようになります。

  productId popularity converted_timestamp date 
11960909 15620743.0 526888.0 2016-01-11   2016-01-11 
11960910 15620743.0 487450.0 2016-02-26   2016-02-26 
11960911 15620743.0 487450.0 2016-02-26   2016-02-26 
12355593 17175984.0 751990.0 2016-01-28   2016-01-28 
12355594 17175984.0 584549.0 2016-01-26   2016-01-26 
12355595 17175984.0 587289.0 2016-01-26   2016-01-26 
12355596 17175984.0 574454.0 2016-01-26   2016-01-26 
12355597 17175984.0 570663.0 2016-01-26   2016-01-26 
12355598 17175984.0 566914.0 2016-01-26   2016-01-26 
12355599 17175984.0 591241.0 2016-01-26   2016-01-26 
12355600 17175984.0 590637.0 2016-01-26   2016-01-26 
12355601 17175984.0 556794.0 2016-01-27   2016-01-27 
12355602 17175984.0 512403.0 2016-02-10   2016-02-10 
12355603 17175984.0 510561.0 2016-02-10   2016-02-10 
12355604 17175984.0 513907.0 2016-02-10   2016-02-10 
12355605 17175984.0 512403.0 2016-02-10   2016-02-10 
12355606 17175984.0 511038.0 2016-02-10   2016-02-10 
12355607 17175984.0 510561.0 2016-02-10   2016-02-10 
12355608 17175984.0 554359.0 2016-01-27   2016-01-27 
17028384 16013607.0 563480.0 2016-02-21   2016-02-21 
17028385 16013607.0 563480.0 2016-02-21   2016-02-21 
17028386 16013607.0 563480.0 2016-02-21   2016-02-21 
17028387 16013607.0 563480.0 2016-02-21   2016-02-21 
17028388 16013607.0 563480.0 2016-02-21   2016-02-21 
17028389 16013607.0 563480.0 2016-02-21   2016-02-21 
17028390 16013607.0 563480.0 2016-02-21   2016-02-21 
17028391 16013607.0 563480.0 2016-02-21   2016-02-21 
17028392 16013607.0 546230.0 2016-02-14   2016-02-14 
17028393 16013607.0 546230.0 2016-02-14   2016-02-14 
17028394 16013607.0 546230.0 2016-02-14   2016-02-14 
17028395 16013607.0 546230.0 2016-02-14   2016-02-14 
17028396 16013607.0 546230.0 2016-02-14   2016-02-14 
17028397 16013607.0 546230.0 2016-02-14   2016-02-14 
17028398 16013607.0 546230.0 2016-02-14   2016-02-14 
17028399 16013607.0 546230.0 2016-02-14   2016-02-14 

同じコードは、このエラーメッセージが表示できます: とValueError:方法で非一意のインデックスのインデックスを再作成または

なぜを制限することはできませんか?助けて ? ありがとうございます。

+0

が重複に問題があります - あなたは、重複 '日付を持ってgroup'一部'に'。 – jezrael

+0

あなたは非常に簡単にそれをシミュレートすることができます - 私はjezraelを参照してください '2015-12-01'から' 2015-12-02' – jezrael

+0

に、試料中の最初の日付を変更します!あなたが正しい !ありがとうございました !重複でこれを行う方法はありませんか?それ以外の場合は、重複値の中央値(例)を求め、コードを適用しようとします。ありがとうございました ! – DataAddicted

答えて

1

重複があります - 一つの可能​​な解決策:

df = df.groupby(['productId','converted_timestamp','date'], as_index=False)['popularity'] 
     .mean() 
print (df) 
    productId converted_timestamp  date  popularity 
0 15620743.0   2016-01-11 2016-01-11 526888.000000 
1 15620743.0   2016-02-26 2016-02-26 487450.000000 
2 16013607.0   2016-02-14 2016-02-14 546230.000000 
3 16013607.0   2016-02-21 2016-02-21 563480.000000 
4 17175984.0   2016-01-26 2016-01-26 580821.000000 
5 17175984.0   2016-01-27 2016-01-27 555576.500000 
6 17175984.0   2016-01-28 2016-01-28 751990.000000 
7 17175984.0   2016-02-10 2016-02-10 511812.166667 

そして、あなたが使用することができます(pandas 0.18.1):

df = df.set_index('date') 
     .groupby('productId', group_keys=False) 
     .resample('D') 
     .ffill() 
     .reset_index() 
+0

パーフェクト!どうもありがとう ! – DataAddicted

関連する問題