2017-02-06 1 views
3

Ich habe einen Pandas Datenrahmen mit einer Spalte aus Listen.
Ziel ist es, die Min jeder Liste in einer Reihe (in einer effizienten Weise) zu finden.Wie bekomme ich den minimalen Wert einer Zeilenliste in einem Pandas Datenrahmen

z.

import pandas as pd 
df = pd.DataFrame(columns=['Lists', 'Min']) 
df['Lists'] = [ [1,2,3], [4,5,6], [7,8,9] ] 
print(df) 

Ziel ist die Min Säule:

 Lists Min 
0 [1, 2, 3] 1 
1 [4, 5, 6] 4 
2 [7, 8, 9] 7 

Danke im Voraus,
gil

+0

Da Ihre 'pandas' Datenstrukturen werden mit Hilfe der' object' dtype, Effizienz töten Sie. –

+0

@ juanpa.arrivillaga ist die Ausgabe dieses Algo 'df [" b "] = np.array (Karte (Liste, [df [" a "]. Shift (x) für x im Bereich (1,4)])) .tolist() '- siehe [http://stackoverflow.com/questions/37967824/how-to-add-a-column-to-a-pandas-dataframe-made-of-arrays-of- der-n-vorhergehende-Wert]. Gibt es eine Möglichkeit, zu beschleunigen? – Gilberto

+1

Das Problem ist, dass Sie Listen in Ihrem 'DataFrame' platzieren, indem Sie dtype' object' machen. Der dtype wird für die zugrundeliegende numpy Datenstruktur vererbt, und "object" dtypes sind langsam. Es ist nicht der Algorithmus, sondern Ihre Datenstruktur. –

Antwort

4

Sie können apply mit min:

df['Min'] = df.Lists.apply(lambda x: min(x)) 
print (df) 
     Lists Min 
0 [1, 2, 3] 1 
1 [4, 5, 6] 4 
2 [7, 8, 9] 7 

Danke juanpa.arrivillaga für Idee:

df['Min'] = [min(x) for x in df.Lists.tolist()] 
print (df) 
     Lists Min 
0 [1, 2, 3] 1 
1 [4, 5, 6] 4 
2 [7, 8, 9] 7 

Timings:

##[300000 rows x 2 columns] 
df = pd.concat([df]*100000).reset_index(drop=True) 

In [144]: %timeit df['Min1'] = [min(x) for x in df.Lists.values.tolist()] 
10 loops, best of 3: 137 ms per loop 

In [145]: %timeit df['Min2'] = [min(x) for x in df.Lists.tolist()] 
10 loops, best of 3: 142 ms per loop 

In [146]: %timeit df['Min3'] = [min(x) for x in df.Lists] 
10 loops, best of 3: 139 ms per loop 

In [147]: %timeit df['Min4'] = df.Lists.apply(lambda x: min(x)) 
10 loops, best of 3: 170 ms per loop 
+2

Heck, ein Listenverständnis in der Spalte 'Lists' könnte schneller sein. –

+0

Danke @jezrael (erstaunliche Geschwindigkeit der Antwort) – Gilberto

+0

@ juanpa.arrivillaga Danke. – Gilberto

Verwandte Themen