2017-06-23 2 views
1

Je possède ce cadre de données:Classement sur plusieurs colonnes en pandas géants

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) 

Les données ressemble à ce

Data

Je veux classer sur ID client et la date, je le code

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

Je reçois un rang différent par ID pour chaque date:

table with rank

Ce que je voudrais voir est le rang par ID mais pour le même datetime obtenir le même rang pour chaque ID.

+0

Peut-être fournir une réelle mise en page de votre sortie souhaitée? :) pas sûr que je l'ai complètement compris! – Roelant

+0

Et l'ajout de pandas d'importation comme pd, importer numpy comme np aiderait aussi bien :) – Roelant

Répondre

0

Voici comment vous pouvez classer par datetime et 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 

Si vous voulez changer la méthode de classement que vous obtiendrez plus d'informations sur le classement de la pandas documentation on ranking

+0

Abhijay Je veux partitionner par ID aussi. Donc, pour ID = 2 rang commencera à partir de 1 un puits. – Nick

+0

@Nick ce n'est pas clairement mentionné dans la question. S'il vous plaît modifier. J'espère que c'est le résultat souhaité que vous vouliez. –

+0

@ Abhijay Ghildyal le rang dense ne semble pas fonctionner comme prévu. Par exemple pour ID = 2 toutes datetimes = 2016-01-27 15:45:20 devrait avoir le rang 1 et toutes les datetimes = 2016-11-27 15:08:04 devrait avoir le rang = 2 – Nick