Pandas: groupe par la valeur de l'index, puis calculer les quantiles?
J'ai un DataFrame indexé sur le month
colonne (défini à l'aide de df = df.set_index('month')
, dans le cas où c'est pertinent):
org_code ratio_cost
month
2010-08-01 1847 8.685939
2010-08-01 1848 7.883951
2010-08-01 1849 6.798465
2010-08-01 1850 7.352603
2010-09-01 1847 8.778501
Je veux ajouter une nouvelle colonne intitulée quantile
, qui attribuera un quantile de la valeur à chaque ligne, basée sur la valeur de ses ratio_cost
pour ce mois.
Donc l'exemple ci-dessus pourrait ressembler à ceci:
org_code ratio_cost quantile
month
2010-08-01 1847 8.685939 100
2010-08-01 1848 7.883951 66.6
2010-08-01 1849 6.798465 0
2010-08-01 1850 7.352603 33.3
2010-09-01 1847 8.778501 100
Comment puis-je faire cela? J'ai essayé ceci:
df['quantile'] = df.groupby('month')['ratio_cost'].rank(pct=True)
Mais je reçois KeyError: 'month'
.
Mise à JOUR: je peux reproduire le bug.
Voici mon fichier CSV: http://pastebin.com/raw/6xbjvEL0
Et voici le code pour reproduire l'erreur:
df = pd.read_csv('temp.csv')
df.month = pd.to_datetime(df.month, unit='s')
df = df.set_index('month')
df['percentile'] = df.groupby(df.index)['ratio_cost'].rank(pct=True)
print df['percentile']
Je suis en utilisant les Pandas 0.17.1 sur OSX.
essayez
Merci. J'ai essayé tout à
Ah, le mois de la colonne est un datetime - est-ce un problème? J'ai mis à jour la question afin de montrer ce qu'il produit.
Merci, mais c'est ce que j'ai d'abord essayé, c'est dans la question...
C'est en fait la
df['quantile'] = df.groupby(df.index)['ratio_cost'].rank(pct=True)
ou df['quantile'] = df.groupby(level=0)['ratio_cost'].rank(pct=True)
Merci. J'ai essayé tout à
print df.groupby(level=0)
, mais il me donne raise ValueError
. Même avec df.groupby(df.index)
.Ah, le mois de la colonne est un datetime - est-ce un problème? J'ai mis à jour la question afin de montrer ce qu'il produit.
Merci, mais c'est ce que j'ai d'abord essayé, c'est dans la question...
C'est en fait la
.rank()
appel qui est à l'origine de l'erreur - voir mise à jour.OriginalL'auteur Richard | 2016-01-28
Vous devez vous connecter pour publier un commentaire.
Vous avez à
sort_index
avantrang
:df = df.set_index('month')
et puis, changeant dedf.groupby(df.index)...
. Je vais l'utiliser pour le débogage.Peut-être pouvez-vous partager vos données, si elles ne sont pas confidental... Parce que ça marche pour moi, très bien.
Et qu'est-ce que votre pandas version
print pd.show_versions()
?Je pense que c'est un bug dans le pas de tri datetime index.
Je suis tombé sur ce problème aujourd'hui, quand mon groupby(df.index) n'a pas de travail, cette solution a permis:)
OriginalL'auteur jezrael