2017-06-23 82 views
1

我有這樣的數據幀:排名在多個列熊貓

dict_data = {'id' : [1,1,1,2,2,2,2,2], 
'datetime' : np.array(['2016-01-03T16:05:52.000000000', '2016-01-03T16:05:52.000000000', 
     '2016-01-03T16:05:52.000000000', '2016-01-27T15:45:20.000000000', 
     '2016-01-27T15:45:20.000000000', '2016-11-27T15:08:04.000000000', 
     '2016-11-27T15:08:04.000000000', '2016-11-27T15:08:04.000000000'], dtype='datetime64[ns]')} 

df_data=pd.DataFrame(dict_data) 

的數據看起來像這樣

Data

我想排名在客戶ID和日期,我用這個代碼

(df_data.assign(rn=df_data.sort_values(['datetime'], ascending=True) 
....:      .groupby(['datetime','id']) 
....:      .cumcount() + 1) 
....:  .sort_values(['datetime','rn']) 
....:) 

我通過每個日期的ID得到不同的等級:

table with rank

我想看到的是ID列,但對於同一日期時間獲取每個ID同一職級。

+0

排名的詳細信息的方法也許提供了一個實際的佈局你想要的輸出? :)不知道我完全得到它! – Roelant

+0

並添加進口熊貓作爲PD,作爲NP進口numpy也會有所幫助:) – Roelant

回答

0

這裏是如何通過datetime和ID排名:

##### RANK BY datetime and id ##### 
In[]: df_data.rank(axis =0,ascending = 1, method = 'dense') 
Out[]: 
    datetime id 
0   1 1 
1   1 1 
2   1 1 
3   2 2 
4   2 2 
5   3 2 
6   3 2 
7   3 2 

##### GROUPBY id AND USE APPLY TO GET VALUE FOR FOR EACH GROUP ##### 
In[]: df_data.rank(axis =0,ascending = 1, method = 'dense').groupby('id').apply(lambda x: x) 
Out[]: 
    datetime id 
0   1 1 
1   1 1 
2   1 1 
3   2 2 
4   2 2 
5   3 2 
6   3 2 
7   3 2 

##### THEN RANK INSIDE EACH GROUP ##### 

In[]: df_data.assign(rank=df_data.rank(axis =0,ascending = 1, method = 'dense').groupby('id').apply(lambda x: x.rank(axis =0,ascending = 1, method = 'dense'))['datetime']) 
Out[]: 
      datetime id rank 
0 2016-01-03 16:05:52 1  1 
1 2016-01-03 16:05:52 1  1 
2 2016-01-03 16:05:52 1  1 
3 2016-01-27 15:45:20 2  1 
4 2016-01-27 15:45:20 2  1 
5 2016-11-27 15:08:04 2  2 
6 2016-11-27 15:08:04 2  2 
7 2016-11-27 15:08:04 2  2 

如果你想改變你的排名會得到來自pandas documentation on ranking

+0

Abhijay我想通過ID進行分區。因此,對於ID = 2,排名將從1開始。 – Nick

+0

@尼克在問題中沒有明確提及。請編輯。我希望這是你想要的理想結果。 –

+0

@ Abhijay Ghildyal密集的排名似乎沒有按預期工作。例如對於ID = 2所有日期= 2016-01-27 15:45:20應該有排名1和所有日期= 2016-11-27 15:08:04應該有排名= 2 – Nick