2013-08-26 9 views
6

Supponiamo corrispondente ho 2 Series a panda:Ottenere min e max elementi per 2 serie nel panda

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) 

Qual è il modo migliore per ottenere valori min/max per corrispondenti elementi di indice. Come:

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

Le uniche funzioni che ho trovato nella documentazione sono funzioni min/max che restituiscono min/max all'interno della serie, mentre la funzione .Applicare non prende l'argomento indice. C'è un modo migliore per implementarlo senza l'iterazione di serie manuale o qualche magia aritmetica (come min_func: a * (a < b) + b * (b < = a), max_func: a * (a> b) + b * (b> = a))

Grazie

risposta

7

Unire la serie in un telaio che allinea automaticamente dall'indice

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 

Indice min/max

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

Osservando l'output desiderato del poster originale, penso che si desideri aggiungere '' axis = 1''. –

+0

@DanAllan grazie ..... – Jeff

+0

Grazie per la risposta dettagliata .. Quali sarebbero le implicazioni di prestazioni rispetto alla soluzione aritmetica? Sulla base degli interni di DataFrame, è più costoso creare nuovi frame di dati rispetto a qualche aggiunta/sottrazione? – Sergey