Python - rolling fonctions pour GroupBy objet
J'ai un moment de la série de l'objet grouped
du type <pandas.core.groupby.SeriesGroupBy object at 0x03F1A9F0>
. grouped.sum()
donne le résultat souhaité, mais je ne peux pas obtenir rolling_sum de travailler avec le groupby
objet. Est-il possible d'appliquer des rolling fonctions de groupby
objets? Par exemple:
x = range(0, 6)
id = ['a', 'a', 'a', 'b', 'b', 'b']
df = DataFrame(zip(id, x), columns = ['id', 'x'])
df.groupby('id').sum()
id x
a 3
b 12
Cependant, je voudrais avoir quelque chose comme:
id x
0 a 0
1 a 1
2 a 3
3 b 3
4 b 7
5 b 12
- Comment exactement ce que vous attendez de roulement de la fonction de travail sur les objets groupés (je veux dire écrire les mathématiques que vous voulez faire dans symboles)?
- Désolé, j'aurais dû être plus clair.
- Si vous voulez faire un
cumsum
sur chacun des groupes et puis cousez le tout dans un seul bloc de données? - Oui, idéalement cumsum et tout de roulement de la fonction(moyenne, somme, mst).
Vous devez vous connecter pour publier un commentaire.
Remarque: identifiés par @kekert, la suite de pandas modèle a été désapprouvée. Voir les solutions actuelles dans les réponses ci-dessous.
df.groupby('id')['x'].rolling(2).mean()
au lieuPour les Googlers qui viennent sur cette vieille question:
En matière de @kekert commentaire de @Garrett, en réponse à l'utilisation de la nouvelle
plutôt que le désormais obsolète
curieusement, il semble que le nouveau .roulant().moyenne() approche renvoie un multi-indexé de la série, indexée par la group_by colonne abord, puis l'index. Alors que, l'ancienne approche serait tout simplement le retour d'une série indexé singulièrement par le df de l'indice, ce qui rend peut-être moins de sens, mais il est très commode pour l'ajout de la série dans une nouvelle colonne dans l'original dataframe.
Donc je pense que j'ai trouvé une solution qui utilise les nouveaux véhicules() la méthode et la marche de la même façon:
qui devrait vous donner la série
laquelle vous pouvez ajouter une colonne:
.transform
plutôt que reset_index?df['x'] = df.groupby('id')['x'].rolling(2).mean().reset_index(drop=True)
groupby(..., sort=False)
si votre groupe de variable n'est pas déjà triées. Je devenais vraiment bizarre résultats lors de l'ajout de ce roulement dire que une nouvelle colonne, car l'ordre ne correspond pas à l'original de la df.Voici une autre manière qui généralise bien et utilise des pandas l'expansion de méthode.
Il est très efficace et fonctionne aussi parfaitement pour les roulant fenêtre de calculs avec des fenêtres fixes, comme pour les séries chronologiques.
Je ne suis pas sûr de la mécanique, mais cela fonctionne. Remarque, la valeur retournée est juste un ndarray. Je pense que vous pourriez appliquer cumulatifs ou "roulement" en fonction de cette manière et il devrait avoir le même résultat.
Je l'ai testé avec
cumprod
,cummax
etcummin
et ils ont tous retourné une ndarray. Je pense que les pandas est assez intelligent pour savoir que ces fonctions renvoient une série et donc la fonction est appliquée comme une transformation plutôt que d'une agrégation.Edit: j'ai trouvé curieux que cette syntaxe renvoie une Série: