2017-07-03 3 views
1

私はPandas Dataframeを2日間のバケットにグループ化しようとしています。例えば、場合、私は、以下の操作を行います。Pandas GroupBy日付チャンク

df = pd.DataFrame() 
df['action_date'] = ['2017-01-01', '2017-01-01', '2017-01-03', '2017-01-04', '2017-01-04', '2017-01-05', '2017-01-06'] 
df['action_date'] = pd.to_datetime(df['action_date'], format="%Y-%m-%d") 
df['user_name'] = ['abc', 'wdt', 'sdf', 'dfe', 'dsd', 'erw', 'fds'] 
df['number_of_apples'] = [1,2,3,4,5,6,2] 
df = df.groupby(['action_date', 'number_of_apples']).sum() 

が、私は一日あたりnumber_of_applesでACTION_DATEによってグループ化されたデータフレームを取得します。

しかし、データフレームを2日間のチャンクで見る場合、どうすればいいですか?私はdate_chunkごとのnumber_of_applesを分析したいのですが、日付2017-01-01 & 2017-01-03の新しいデータフレームを作成するか、2017-01-04 & 2017-01-05の別のデータフレームを作成し、最後に1つを作成するか2017-01-06のために、またはただ再グループ化し、内部で働くことによって。

EDIT:最終的には、各チャンクのリンゴの数に基づいてユーザーのリストを作成したいので、各チャンクのリンゴの合計や平均を求めたくありません。混乱させて申し訳ありません!

ありがとうございます!

答えて

1

あなたはresampleを使用することができます。

print (df.resample('2D', on='action_date')['number_of_apples'].sum().reset_index()) 
    action_date number_of_apples 
0 2017-01-01     3 
1 2017-01-03    12 
2 2017-01-05     8 

EDIT:

print (df.resample('2D', on='action_date')['user_name'].apply(list).reset_index()) 
    action_date  user_name 
0 2017-01-01  [abc, wdt] 
1 2017-01-03 [sdf, dfe, dsd] 
2 2017-01-05  [erw, fds] 
+0

ありがとうございます!これも機能しますが、私が探しているものではありません - 申し訳ありませんが、私は不明でした!私の編集内容を見てください。 – cgp25

+0

編集された回答を参照してください。 – jezrael

+0

うれしいことに、うれしい1日! – jezrael

1

TimeGrouperを使用して2日間グループ化してみてください。

>>df.index=df.action_date 
>>dg = df.groupby(pd.TimeGrouper(freq='2D'))['user_name'].apply(list) # 2 day frequency 
>>dg.head() 

action_date 
2017-01-01   [abc, wdt] 
2017-01-03 [sdf, dfe, dsd] 
2017-01-05   [erw, fds] 
+0

はあなたに感謝!これはうまくいきますが、十分に私の質問では明確ではありませんでした。私の上の編集を見てください、申し訳ありません! – cgp25

+0

私の編集内容を見る - 私はあなたが上記の答えを受け入れたのを見ましたが、これはそれを行う別の方法です! – qbzenker

+0

はい、これも機能します!ありがとうございました! – cgp25