2013-08-26 7 views
6

Załóżmy, że mam Series 2 w pand:Get min i max dla 2 elementy odpowiadające serii w pand

from datetime import datetime, timedelta 
import pandas as pd 
d = datetime.now() 
index = [d + timedelta(seconds = i) for i in range(5)] 
a = pd.Series([1,4,5,7,8], index = index) 
b = pd.Series([2,3,6,7,8], index = index) 

Jaki jest najlepszy sposób, aby uzyskać wartości min/max dla odpowiednich elementów indeksu. odczuwalna:

min_func(a, b): [1,3,5,7,8] (for given index) 
max_func(a, b): [2,4,6,7,8] 

Jedyne funkcje mogłem znaleźć w dokumentacji są min/max funkcje, które zwracają Min/Max w serii, podczas gdy funkcja .apply nie bierze argument indeksu. Czy istnieje lepszy sposób na wprowadzenie tego bez ręcznej iteracji serii lub jakiejś magii arytmetycznej (jak min_func: a * (a < b) + b * (b < = a), max_func: a * (a> b) + b * (b> = a))

Dzięki

Odpowiedz

7

serii połączono w ramce, która automatycznie dopasowuje indeksem

In [51]: index 
Out[51]: 
[datetime.datetime(2013, 8, 26, 18, 33, 48, 990974), 
datetime.datetime(2013, 8, 26, 18, 33, 49, 990974), 
datetime.datetime(2013, 8, 26, 18, 33, 50, 990974), 
datetime.datetime(2013, 8, 26, 18, 33, 51, 990974), 
datetime.datetime(2013, 8, 26, 18, 33, 52, 990974)] 

In [52]: a = pd.Series([1,4,5,7,8], index = index) 

In [53]: b = pd.Series([2,3,6,7,8], index = index) 

In [54]: a 
Out[54]: 
2013-08-26 18:33:48.990974 1 
2013-08-26 18:33:49.990974 4 
2013-08-26 18:33:50.990974 5 
2013-08-26 18:33:51.990974 7 
2013-08-26 18:33:52.990974 8 
dtype: int64 

In [55]: b 
Out[55]: 
2013-08-26 18:33:48.990974 2 
2013-08-26 18:33:49.990974 3 
2013-08-26 18:33:50.990974 6 
2013-08-26 18:33:51.990974 7 
2013-08-26 18:33:52.990974 8 
dtype: int64 

In [56]: df = DataFrame({ 'a' : a, 'b' : b }) 

In [57]: df 
Out[57]: 
          a b 
2013-08-26 18:33:48.990974 1 2 
2013-08-26 18:33:49.990974 4 3 
2013-08-26 18:33:50.990974 5 6 
2013-08-26 18:33:51.990974 7 7 
2013-08-26 18:33:52.990974 8 8 

Min/Max

In [9]: df.max(1) 
Out[9]: 
2013-08-26 18:33:48.990974 2 
2013-08-26 18:33:49.990974 4 
2013-08-26 18:33:50.990974 6 
2013-08-26 18:33:51.990974 7 
2013-08-26 18:33:52.990974 8 
Freq: S, dtype: int64 

In [10]: df.min(1) 
Out[10]: 
2013-08-26 18:33:48.990974 1 
2013-08-26 18:33:49.990974 3 
2013-08-26 18:33:50.990974 5 
2013-08-26 18:33:51.990974 7 
2013-08-26 18:33:52.990974 8 
Freq: S, dtype: int64 

Indeks min./maks.

In [11]: df.idxmax(1) 
Out[11]: 
2013-08-26 18:33:48.990974 b 
2013-08-26 18:33:49.990974 a 
2013-08-26 18:33:50.990974 b 
2013-08-26 18:33:51.990974 a 
2013-08-26 18:33:52.990974 a 
Freq: S, dtype: object 

In [12]: df.idxmin(1) 
Out[12]: 
2013-08-26 18:33:48.990974 a 
2013-08-26 18:33:49.990974 b 
2013-08-26 18:33:50.990974 a 
2013-08-26 18:33:51.990974 a 
2013-08-26 18:33:52.990974 a 
Freq: S, dtype: object 
+0

Patrząc na pożądany wynik oryginału, myślę, że chcesz dodać "oś = 1". –

+0

@DanAllan dzięki ..... – Jeff

+0

Dziękuję za szczegółową odpowiedź. Jakie byłyby konsekwencje wydajności w porównaniu do rozwiązania arytmetycznego? Czy na podstawie wewnętrznych elementów DataFrame droższe jest tworzenie nowej ramki danych w porównaniu z kilkoma dodatkami/odejmowaniami? – Sergey

Powiązane problemy