2017-07-26 46 views
0

例子:Python熊貓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件事,我想實現,但我仍然在學習過程中,非常感謝所有幫助,指導我在正確的方向。

  • 創建的「訂單之間的時間」我在哪裏可以找到分鐘,平均一個列表中,如果「訂單之間的時間」最大
  • 找出得到VS之間的時間order_3和訂單_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()

首先,我們使用groupby到組使用client作爲一個關鍵的命令,那麼我們只能選擇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