2016-09-13 34 views
3

私は次のように各インスタンスは、タイムスタンプ、IDと番号のリストを持っているデータフレームを持っている:私は一日でリサンプリングする各IDについてはパンダ集計リスト/ GROUPBY

timestamp   | id | lists 
---------------------------------- 
2016-01-01 00:00:00 | 1 | [2, 10] 
2016-01-01 05:00:00 | 1 | [9, 10, 3, 5] 
2016-01-01 10:00:00 | 1 | [1, 10, 5] 
2016-01-02 01:00:00 | 1 | [2, 6, 7] 
2016-01-02 04:00:00 | 1 | [2, 6] 
2016-01-01 02:00:00 | 2 | [0] 
2016-01-01 08:00:00 | 2 | [10, 3, 2] 
2016-01-01 14:00:00 | 2 | [0, 9, 3] 
2016-01-02 03:00:00 | 2 | [0, 9, 2] 

(これは簡単です)、同じ日に発生したインスタンスの リストをすべて連結します。リサンプル+連結/合計リサンプルは、すべての非数値列(see here)を除去するので は動作しません

私はこれに似た何かを書きたい:希望

daily_data = data.groupby('id').resample('1D').concatenate() # .concatenate() does not exist 

結果:

timestamp | id | lists 
---------------------------------- 
2016-01-01 | 1 | [2, 10, 9, 10, 3, 5, 1, 10, 5] 
2016-01-02 | 1 | [2, 6, 7, 2, 6] 
2016-01-01 | 2 | [0, 10, 3, 2] 
2016-01-02 | 2 | [0, 9, 3, 0, 9, 2] 

ここでは説明のために使用した入力を生成するスクリプトをコピーできます:

import pandas as pd 
from random import randint 

time = pd.to_datetime(['2016-01-01 00:00:00', '2016-01-01 05:00:00', 
         '2016-01-01 10:00:00', '2016-01-02 01:00:00', 
         '2016-01-02 04:00:00', '2016-01-01 02:00:00', 
         '2016-01-01 08:00:00', '2016-01-01 14:00:00', 
         '2016-01-02 03:00:00' ] 
        ) 

id_1 = [1] * 5 
id_2 = [2] * 4 

lists = [0] * 9 
for i in range(9): 
    l = [randint(0,10) for _ in range(randint(1,5)) ] 
    l = list(set(l)) 
    lists[i] = l 

data = {'timestamp': time, 'id': id_1 + id_2, 'lists': lists} 

example = pd.DataFrame(data=data) 

連結リスト内の重複を削除する方法がある場合は、ボーナスポイントを指定します。

答えて

5

としては、パンダバージョン'timestamp'と0.18.1+

  • ​​でこれだけの作品は、後resample
  • groupby'id'列に準備をしてlists列を選択する@jezraelによって指摘
  • resampleの後にリストのsumを連結します。
  • reset_indexは、各リスト項目を使用するリスト内包のユニークなカウントに正しい順序

df.set_index('timestamp').groupby('id').lists.resample('D').sum() \ 
    .reset_index('id').reset_index() 

enter image description here

+0

これは私の問題を解決します!私は同じコードを使用していましたが、列名 "リスト"を指定せずに、タイムスタンプとIDだけを返しました。ありがとうございました :-) – Ludovica

0

の列を取得するには:

a = [list(set(l)) for l in df.lists] 
df.loc[:,'lists'] = a