web-dev-qa-db-fra.com

Tracer les résultats de Pandas GroupBy

Je commence à apprendre Pandas et j'essaie de trouver les moyens les plus pythoniques (ou panda-thonic?) Pour effectuer certaines tâches.

Supposons que nous ayons un DataFrame avec les colonnes A, B et C.

  • La colonne A contient des valeurs booléennes: la valeur A de chaque ligne est vraie ou fausse.
  • La colonne B contient certaines valeurs importantes que nous voulons tracer.

Ce que nous voulons découvrir, c'est les distinctions subtiles entre les valeurs B pour les lignes dont A est défini sur faux, et les valeurs B pour les lignes qui ont A est vrai.

En d'autres termes, comment puis-je regrouper par la valeur de la colonne A (vrai ou faux), puis tracer les valeurs de la colonne B pour les deux groupes sur le même graphique? Les deux jeux de données doivent être colorés différemment pour pouvoir distinguer les points.


Ensuite, ajoutons une autre fonctionnalité à ce programme: avant de représenter graphiquement, nous voulons calculer une autre valeur pour chaque ligne et la stocker dans la colonne D. Cette valeur est la moyenne de toutes les données stockées dans B pendant les cinq minutes avant un enregistrement - mais nous incluons uniquement les lignes qui ont la même valeur booléenne stockée dans A.

En d'autres termes, si j'ai une ligne où A=True et time=t, Je veux calculer une valeur pour la colonne D qui est la moyenne de B pour tous les enregistrements de temps t-5 à t qui ont le même A=True.

Dans ce cas, comment pouvons-nous exécuter le groupby sur des valeurs de A, puis appliquer ce calcul à chaque groupe individuel, et enfin tracer les valeurs D pour les deux groupes?

39
Maxim Zaslavsky

Je pense que @herrfz a atteint tous les points forts. Je vais juste étoffer les détails:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

sin = np.sin
cos = np.cos
pi = np.pi
N = 100

x = np.linspace(0, pi, N)
a = sin(x)
b = cos(x)

df = pd.DataFrame({
    'A': [True]*N + [False]*N,
    'B': np.hstack((a,b))
    })

for key, grp in df.groupby(['A']):
    plt.plot(grp['B'], label=key)
    grp['D'] = pd.rolling_mean(grp['B'], window=5)    
    plt.plot(grp['D'], label='rolling ({k})'.format(k=key))
plt.legend(loc='best')    
plt.show()

enter image description here

43
unutbu