web-dev-qa-db-fra.com

Comment créer des colonnes Decile et Quintile pour classer une autre variable en fonction de la taille en utilisant Python, Pandas?

J'ai un bloc de données avec une colonne contenant Investment qui représente le montant investi par un trader. Je voudrais créer 2 nouvelles colonnes dans le bloc de données; l'un donnant un rang décile et l'autre un quintile basé sur la taille Investment. Je veux que 1 représente le décile avec les investissements les plus importants et 10 représente le plus petit. Smilarly, je veux 1 pour représenter le quintile avec les investissements les plus importants et 5 représentant les plus petits.

Je suis nouveau sur Pandas, alors y a-t-il un moyen de le faire facilement? Merci!

16
finstats

La fonctionnalité que vous recherchez se trouve dans pandas.qcuthttp://pandas.pydata.org/pandas-docs/stable/generated/pandas.qcut.html

In [51]: import numpy as np

In [52]: import pandas as pd

In [53]: investment_df = pd.DataFrame(np.arange(10), columns=['investment'])

In [54]: investment_df['decile'] = pd.qcut(investment_df['investment'], 10, labels=False)

In [55]: investment_df['quintile'] = pd.qcut(investment_df['investment'], 5, labels=False)

In [56]: investment_df
Out[56]: 
   investment  decile  quintile
0           0       0         0
1           1       1         0
2           2       2         1
3           3       3         1
4           4       4         2
5           5       5         2
6           6       6         3
7           7       7         3
8           8       8         4
9           9       9         4   

Il n'est pas standard d'étiqueter le plus grand centile avec le plus petit nombre, mais vous pouvez le faire en

In [60]: investment_df['quintile'] = pd.qcut(investment_df['investment'], 5, labels=np.arange(5, 0, -1))

In [61]: investment_df['decile'] = pd.qcut(investment_df['investment'], 10, labels=np.arange(10, 0, -1))

In [62]: investment_df
Out[62]: 
   investment decile quintile
0           0     10        5
1           1      9        5
2           2      8        4
3           3      7        4
4           4      6        3
5           5      5        3
6           6      4        2
7           7      3        2
8           8      2        1
9           9      1        1
28
Dan Frank