2017-07-26 9 views
0

例:Python pandas groupby操作ですか? DFがどのように見えるかの

customer order_datetime 
a   01-03-2017 12:00:00 PM 
b   01-04-2017 12:00:00 PM 
c   01-07-2017 12:00:00 PM 
a   01-08-2017 12:00:00 PM 
b   01-09-2017 12:00:00 PM 
a   01-11-2017 12:00:00 PM 

私が達成したかったが、私は学習過程ではまだだ2事がありますが、本当に正しい方向に私を導くために任意の助けに感謝します。

  • 間の時間対、「オーダー間の時間は」速くなれば/遅くして下さい
  • 最大
  • 、平均値、order_3とorder_2の間、すなわち時間を、私は分を見つけることができる「オーダー間の時間」のリストを作成します。 order_2とorder_1
+0

これは、のように感じています割り当て。真剣な試みをして、コードで問題を取り返してください。 – Parfait

答えて

1

この例では、割り当ての正しい方向に設定する必要があります。

まず、私はあなたの質問に示したものと類似のデータフレームを作成しています:

import pandas as pd 
import numpy as np 
import datetime as dt 

orders = pd.DataFrame({ 
    'client': np.random.randint(65, 70, size=15), 
    'date': np.random.randint(0, 30, size=15)}) 

orders.client = orders.client.apply(chr) 
orders.date = orders.date.apply(
    pd.to_datetime, unit='d', origin=dt.date(2017, 1, 1), box=False) 
# Sorting here is not necessary, just for visualization 
orders.sort_values(['client', 'date'], inplace=True) 
orders.reset_index(inplace=True, drop=True) 
orders.head() 

>>>> 
    client  date 
0  A 2017-01-27 
1  A 2017-01-29 
2  A 2017-01-30 
3  B 2017-01-03 
4  B 2017-01-13 

解決の鍵はラインorders.groupby('client').date.apply(pd.Series.sort_values).diff()です。

我々はキーとしてclientを使用してグループに注文をgroupbyを使用まず、我々は唯一のdate列を選択し、pd.Series.sort_valuesと、各グループで日付を並べ替えるには、最終的に我々は、次のいずれかで、各レコードの差異を計算するためにdiffを使用します(各グループの日付を並べ替える必要がある理由はここにあります)。

残りのコードは結果を視覚化するだけです。つまり、取得したシリーズの名前を変更し、初期のDataFrameと連結します。

diff_df = pd.concat([ 
    orders, 
    orders.groupby('client').date.diff().rename('diff')], axis=1) 
diff_df.head(10) 

>>>> 
    client  date diff 
0  A 2017-01-27  NaT 
1  A 2017-01-29 2 days 
2  A 2017-01-30 1 days 
3  B 2017-01-03  NaT 
4  B 2017-01-13 10 days 
5  B 2017-01-18 5 days 
6  B 2017-01-24 6 days 
7  C 2017-01-01  NaT 
8  C 2017-01-02 1 days 
9  C 2017-01-03 1 days 

時間があれば、必要なすべての種類のグループ内メトリックを計算できます。

まずはpd.Series.describeを試すことができます。

diff_df.groupby('client').diff.describe() 

>>>> 
     count    mean      std    min \ 
client                  
A   1 5 days 00:00:00      NaT 5 days 00:00:00 
B   1 12 days 00:00:00      NaT 12 days 00:00:00 
C   3 4 days 00:00:00 1 days 17:34:09.189773 2 days 00:00:00 
D   1 4 days 00:00:00      NaT 4 days 00:00:00 
E   4 5 days 00:00:00 3 days 03:53:40.789838 2 days 00:00:00 

        25%    50%    75%    max 
client                   
A  5 days 00:00:00 5 days 00:00:00 5 days 00:00:00 5 days 00:00:00 
B  12 days 00:00:00 12 days 00:00:00 12 days 00:00:00 12 days 00:00:00 
C  3 days 12:00:00 5 days 00:00:00 5 days 00:00:00 5 days 00:00:00 
D  4 days 00:00:00 4 days 00:00:00 4 days 00:00:00 4 days 00:00:00 
E  2 days 18:00:00 4 days 12:00:00 6 days 18:00:00 9 days 00:00:00 

それが十分で独自のaggregationsを定義することができない場合。

あなたは、単一のシリーズ上で動作している場合は、関数のリストが必要になります

metrics = [pd.Series.count, pd.Series.min, pd.Series.max, pd.Series.mean] 
diff_df.groupby('client').diff.aggregate(metrics) 

>>>> 
     count nunique  min  max mean 
client           
A   1  1 5 days 5 days 5 days 
B   1  1 12 days 12 days 12 days 
C   3  2 2 days 5 days 4 days 
D   1  1 4 days 4 days 4 days 
E   4  4 2 days 9 days 5 days 

それとも{column -> function, column -> function_list}の辞書あなたが全体のデータフレーム上で動作している場合:

metrics = { 
    'date': [pd.Series.count, pd.Series.nunique], 
    'diff': [pd.Series.min, pd.Series.max, pd.Series.mean], 
} 
diff_df.groupby('client').aggregate(metrics) 

>>>> 
      diff     date   
      min  max mean count nunique 
client          
A  5 days 5 days 5 days  2  2 
B  12 days 12 days 12 days  2  2 
C  2 days 5 days 4 days  4  4 
D  4 days 4 days 4 days  2  2 
E  2 days 9 days 5 days  5  5 
関連する問題