2013-02-25 17 views
16

Ich weiß über diese Spalte slice Methoden:keep/slice bestimmte Spalten in Pandas

df2 = df[["col1", "col2", "col3"]] und df2 = df.ix[:,0:2]

aber ich frage mich, ob es einen Weg gibt, Spalten von vorne/Mitte/Ende zu schneiden ein Datenframe in demselben Slice, ohne jedes einzelne aufzulisten.

Zum Beispiel ein Datenrahmen df mit Spalten: col1, col2, col3, col4, col5 und col6.

Gibt es eine Möglichkeit, so etwas zu tun?

df2 = df.ix[:, [0:2, "col5"]]

Ich bin in der Situation, wo ich Hunderte von Spalten und müssen regelmäßig bestimmte diejenigen, für unterschiedliche Anforderungen schneiden. Ich habe die Dokumentation überprüft und so etwas nicht gesehen. Habe ich etwas übersehen?

Danke!

* Bearbeitet, um klarer zu sein über das, was ich suche.

Antwort

14

IIUC, die einfachste Art und Weise schreiben konnte ich kann mir so etwas wie dieses wäre:

>>> import pandas as pd 
>>> import numpy as np 
>>> df = pd.DataFrame(np.random.randn(5, 10)) 
>>> df[list(df.columns[:2]) + [7]] 
      0   1   7 
0 0.210139 0.533249 1.780426 
1 0.382136 0.083999 -0.392809 
2 -0.237868 0.493646 -1.208330 
3 1.242077 -0.781558 2.369851 
4 1.910740 -0.643370 0.982876 

wo der list Anruf nicht optional ist, da sonst das Index Objekt Vektor-fügen sich die versuchen, 7.

Es wäre möglich, einen speziellen Fall so etwas wie numpy der r_ so dass

df[col_[:2, "col5", 3:6]] 

funktionieren würde, obwohl ich weiß nicht, ob es der Mühe wert wäre.

-1

Nicht sicher, was genau Sie fragen. Wenn Sie die ersten und letzten 5 Zeilen einer bestimmten Spalte möchten, können Sie so etwas wie dieses

df = pd.DataFrame({'col1': np.random.randint(0,3,1000), 
       'col2': np.random.rand(1000), 
       'col5': np.random.rand(1000)}) 
In [36]: df['col5'] 
Out[36]: 
0  0.566218 
1  0.305987 
2  0.852257 
3  0.932764 
4  0.185677 
... 
996 0.268700 
997 0.036250 
998 0.470009 
999 0.361089 
Name: col5, Length: 1000 
In [38]: df['col5'][(df.index < 5) | (df.index > (len(df) - 5))] 
Out[38]: 
0  0.566218 
1  0.305987 
2  0.852257 
3  0.932764 
4  0.185677 
996 0.268700 
997 0.036250 
998 0.470009 
999 0.361089 
Name: col5 

oder allgemeiner tun, können Sie eine Funktion

In [41]: def head_and_tail(df, n=5): 
    ...:  return df[(df.index < n) | (df.index > (len(df) - n))] 
In [44]: head_and_tail(df, 7) 
Out[44]: 
    col1  col2  col5 
0  0 0.489944 0.566218 
1  1 0.639213 0.305987 
2  1 0.000690 0.852257 
3  2 0.620568 0.932764 
4  0 0.310816 0.185677 
5  0 0.930496 0.678504 
6  2 0.165250 0.440811 
994  2 0.842181 0.636472 
995  0 0.899453 0.830839 
996  0 0.418264 0.268700 
997  0 0.228304 0.036250 
998  2 0.031277 0.470009 
999  1 0.542502 0.361089 
+0

Ich suche nach einer Möglichkeit, bestimmte Spalten in einem Datenrahmen zu "behalten" und den Rest auszuschließen. Die von Ihnen vorgeschlagene Methode eignet sich gut für die Auswahl erster und letzter ** Zeilen ** eines Datenrahmens für beliebige Spalten. Ich möchte jedoch Spalten mithilfe kombinierter Bereiche/Listen von Spalten in einem Segment behalten/löschen. – bdiamante

+0

Also anstelle von dem, was ich eingefügt habe (erste 5 und letzte 5 Zeilen), wollen Sie einen Weg, * diese Zeilen * auszuschließen? Können Sie ein konkretes Beispiel mit einem kleinen Datenrahmen geben, der die für Sie interessanten Untermengen zeigt? – beardc

4

Wenn Ihre Spaltennamen Informationen enthalten, nach denen Sie filtern können, können Sie df.filter (regex = 'name *') verwenden. Ich verwende dies, um zwischen meinen 189 Datenkanälen von a1_01 zu b3_21 zu filtern und es funktioniert gut.