2012-08-09 8 views
7

Próbuję owijać mój mózg wokół struktur danych pandas i próbować użyć ich trochę w gniewie. Zorientowałem się, że operacje groupby powodują powstanie obiektu serii pand. Ale nie jestem w stanie wymyślić, jak korzystać z powstałej serii. W szczególności, chcę zrobić dwie rzeczy:Dołączanie do serii Pand z hierarchicznym indeksem powrót do źródła DataFrame

1) „join” wyniki z powrotem do pierwotnej DataFrame

2) Wybierz konkretną wartość wynikającą z serii opartej na indeksie hierarchicznej.

Oto przykład zabawka do pracy z:

import pandas 
df = pandas.DataFrame({'group1': ['a','a','a','b','b','b'], 
         'group2': ['c','c','d','d','d','e'], 
         'value1': [1.1,2,3,4,5,6], 
         'value2': [7.1,8,9,10,11,12] 
}) 
dfGrouped = df.groupby(["group1", "group2"] , sort=True) 

## toy function, obviously not my real function 
def fun(x): return mean(x**2) 

results = dfGrouped.apply(lambda x: fun(x.value1)) 

tak powstałe serii (wyników) wygląda następująco:

group1 group2 
a  c   2.605 
     d   9.000 
b  d   20.500 
     e   36.000 

to ma sens. Ale w jaki sposób:

1) dołączyć do tej z powrotem do pierwotnego DataFrame df

2) Wybierz jedną wartość, gdzie, powiedzmy, grupa1 == 'b' & grupa2 == 'd'

Odpowiedz

8

Więc dla pozostałego # 1.

In [9]: df 
Out[9]: 
    group1 group2 value1 value2 
0  a  c  1.1  7.1 
1  a  c  2.0  8.0 
2  a  d  3.0  9.0 
3  b  d  4.0 10.0 
4  b  d  5.0 11.0 
5  b  e  6.0 12.0 

In [10]: results 
Out[10]: 
group1 group2 
a  c   2.605 
     d   9.000 
b  d   20.500 
     e   36.000 

In [11]: df.set_index(['group1', 'group2'], inplace=True)['results'] = results 

In [12]: df 
Out[12]: 
       value1 value2 results 
group1 group2 
a  c   1.1  7.1 2.605 
     c   2.0  8.0 2.605 
     d   3.0  9.0 9.000 
b  d   4.0 10.0 20.500 
     d   5.0 11.0 20.500 
     e   6.0 12.0 36.000 

In [13]: df.reset_index() 
Out[13]: 
    group1 group2 value1 value2 results 
0  a  c  1.1  7.1 2.605 
1  a  c  2.0  8.0 2.605 
2  a  d  3.0  9.0 9.000 
3  b  d  4.0 10.0 20.500 
4  b  d  5.0 11.0 20.500 
5  b  e  6.0 12.0 36.000 
+1

Wygląda dokładnie tak, jak próbowałem. To dobry przykład, jak ustawić indeks. Nie zdawałem sobie sprawy, jak to działa. –

+0

@ Wouter-Overmeire - bardzo ładne. Walczyłem z tym dzisiaj. – John

+0

@ wouter-overmeire, @ jd-long - jak by to działało, gdyby więcej niż jeden wynik musiał być dodany z powrotem do DataFrame. Na przykład, w jaki sposób wyniki dwóch oddzielnych funkcji, np. 'def UCL (x): zwraca średnią (x2) + np.std * 2' i' def LCL (x): zwraca średnią z powrotem (x2) -np.std * 2' z powrotem do df? Czy jest jakiś lepszy sposób? – John

3

Choć monkeying wokół odkryłem odpowiedź na # 2:

results["b","d"] daje mi wartość gdzie grupa1 == 'b' & grupa2 == 'd'