2013-03-17 9 views
37

Zaczynam się uczyć Pand i próbuję znaleźć najbardziej Pythonowe (lub panda-thonic?) Sposoby wykonywania pewnych zadań.Plotting results of Pandas GroupBy

Załóżmy, że mamy DataFrame z kolumn A, B i C.

  • Kolumna A zawiera wartości logicznych: każdy wiersz to jest wartość nie jest ani prawdziwe, czy fałszywe.
  • Kolumna B ma kilka ważnych wartości, które chcemy wydrukować.

To, co chcemy odkryć, to subtelne rozróżnienia między wartościami B dla wierszy, które mają A ustawione na fałsz, a wartości B dla wierszy, które mają A, są prawdziwe.

Innymi słowy, jak mogę pogrupować według wartości kolumny A (prawda lub fałsz), a następnie wykreślić wartości kolumny B dla obu grup na tym samym wykresie? Dwa zestawy danych powinny być inaczej pokolorowane, aby móc odróżnić punkty.


Następnie dodajmy kolejną funkcję do tego programu: przed wykresów, chcemy obliczyć inną wartość dla każdego wiersza i przechowywać go w kolumnie D. Wartość ta jest średnią wszystkich danych przechowywanych w B dla całego na pięć minut przed zapisem - ale tylko to wiersze, które mają taką samą wartość logiczną przechowywane w A.

innymi słowy, jeśli mam wiersz gdzie A=True i time=t chcę obliczyć wartość dla kolumny D, które jest średnią z B dla wszystkich rekordów od czasu t-5 do t, które mają ten sam A=True.

W takim przypadku, w jaki sposób możemy wykonać groupby na wartościach A, zastosować to obliczenie do każdej pojedynczej grupy, a na końcu wykreślić wartości D dla dwóch grup?

+4

Czy masz jakieś przykładowe dataframes? wygląda na to, że możesz zrobić coś takiego jak zapisanie obiektu groupby w zmiennej: 'grouped = df.groupby ('A')', następnie wykonaj pętlę for do wykreślenia: 'dla g, d w grupie: wykres (d [ "B"], kolor = g) ". Mniej więcej to samo dla drugiego pytania, w którym można użyć pandy 'rolling_mean', aby utworzyć nową kolumnę D. – herrfz

Odpowiedz

42

Myślę, że @herrfz trafił we wszystkie najważniejsze punkty. Ja po prostu ciałem się szczegółów:

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

+0

To jest idealne! Czy mógłbyś poruszyć kwestię implementacji bardziej spersonalizowanych obliczeń dla kolumny D, na przykład, czy chciałem wykonać wyspecjalizowane obliczenia, które nie są objęte wbudowaną "toczącą się" funkcją Pandy? Dzięki. (@herrfz) –

+0

'rolling_mean' to tylko jedna z [wielu funkcji toczenia w Pandach] (http://pandas.pydata.org/pandas-docs/stable/computation.html#moving-rolling-statistics-moments). Aby zdefiniować niestandardową funkcję toczenia, użyj 'rolling_apply'. Na połączonej stronie znajduje się przykład. – unutbu

+0

Dzięki. Mam problem z dostosowaniem tego przykładu do tego, co próbuję osiągnąć, więc zadałem inne pytanie tutaj: http://stackoverflow.com/questions/15487022/customizing-rolling-apply-function-in-python-pandas –