2016-04-28 4 views
2

Ich suche die effizienteste Art und Weise mehrere Spalten von einem Datenrahmen zu wählen:Effiziente Spalte Indizierung und Selektion in PANDA

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.random.rand(4,8), columns = list('abcdefgh')) 

result of code above

I Spalten die folgenden Spalten ein auswählen möchten, c, e, f, g nur, die unter Verwendung von Indizierung durchgeführt werden kann:

df.ix[:,[0,2,4,5,6]] 

Für einen großen Datenrahmen von vielen Säulen, scheint dies eine ineffiziente Methode, und ich würde mu ch angeben eher aufeinanderfolgende Spaltenindizes durch Bereich, wenn überhaupt möglich, aber Versuche, wie die folgenden, beide Syntaxfehler werfen:

df.ix[:,[0,2,4:6]] 

oder

df.ix[:,[0,2,[4:6]]] 

Antwort

1

Ich glaube, Sie range verwenden können:

print [0,2] + range(4,7) 
[0, 2, 4, 5, 6] 


print df.ix[:, [0,2] + range(4,7)] 
      a   c   e   f   g 
0 0.278231 0.192650 0.653491 0.944689 0.663457 
1 0.416367 0.477074 0.582187 0.730247 0.946496 
2 0.396906 0.877941 0.774960 0.057290 0.556719 
3 0.119685 0.211581 0.526096 0.213282 0.492261 
+0

ausgezeichnet, Ihre Antwort hat mich auch mehr über die Flexibilität der ‚Reichweite‘ Befehl zu entdecken! http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-integer – thescoop

-1

Pandas ist relativ gut gedacht, der kürzeste Weg der effizienteste ist:

df[['a','c','e','f','g']] 

Sie brauchen nicht ix, da es eine Suche in Ihren Daten durchführt, aber dafür brauchen Sie natürlich die Namen der Spalten.

+0

Von pandas docs: Hinweis Die Indexoperatoren Python und NumPy [] und der Attributoperator. bieten einen schnellen und einfachen Zugang zu Pandas Datenstrukturen in einer Vielzahl von Anwendungsfällen. Dies macht interaktive Arbeit intuitiv, da es wenig Neues zu lernen gibt, wenn Sie bereits wissen, wie man mit Python-Wörterbüchern und NumPy-Arrays umgeht. Da jedoch die Art der Daten, auf die zugegriffen werden soll, nicht im Voraus bekannt ist, hat die direkte Verwendung von Standardoperatoren einige Optimierungsgrenzen. Für den Produktionscode empfahlen wir, dass Sie die in diesem Kapitel beschriebenen optimierten Pandas-Datenzugriffsmethoden nutzen. –

1

Sobald Sie nicht benachbarte Spalten auswählen, zahlen Sie die Last.
Wenn Ihre Daten homogen sind, erhalten Sie eine deutliche Verbesserung, wenn Sie auf numpy zurückfallen.

In [147]: %timeit df[['a','c','e','f','g']] 
      %timeit df.values[:,[0,2,4,5,6]] 
      %timeit df.ix[:,[0,2,4,5,6]] 
      %timeit pd.DataFrame(df.values[:,[0,2,4,5,6]],columns=df.columns[[0,2,4,5,6]]) 
100 loops, best of 3: 2.67 ms per loop 
10000 loops, best of 3: 58.7 µs per loop 
1000 loops, best of 3: 1.81 ms per loop 
1000 loops, best of 3: 568 µs per loop