2016-06-16 15 views
1

Ich möchte Pandas in Python verwenden, um mehrere Dataframes durchzulaufen und nur Überschriften aus einer angegebenen keep_col-Liste zu behalten. Der Code führt zu einem Fehler, wenn ein DataFrame keine angegebene Überschrift enthält (KeyError: "['str2'] nicht im Index").Pandas, die DataFrames durchlaufen und nur Spaltenüberschriften beibehalten. Fehler Ergebnisse, wenn die angegebene Überschrift nicht im Datenrahmen ist

Der folgende pandas Code erstellt 2 Beispiel Datenrahmen mit unterschiedlichen Namen Spaltenüberschrift:

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame(np.random.randn(2,5), columns=('A','B','str1','str2','str3')) 
df2 = pd.DataFrame(np.random.randn(2,3), columns=('A','B','str1')) 
print df1 
print df2 

Ausgangsdatenrahmen

A   B   str1  str2  str3 
-0.152686 0.189076 -1.079168 -0.823674 1.489668 
-1.272144 0.694862 0.036248 0.319550 0.782666 

A   B   str1 
0.310152 1.302962 -0.284632 
1.046044 0.090650 0.861716 

Der folgende Code führt zu einem Fehler, weil 'str2' nicht in ‚DF2 ist ".

Wie kann dies geändert werden, um eine "keep_col" -Listenfolge zu ignorieren, wenn sie sich nicht in einer DataFrame-Überschrift befindet?

#delete columns 
keep_col = ['A','str2'] #need code here to ignore 'str2' when generating 'df2' 
new_df1 = df1[keep_col] 
new_df2 = df2[keep_col] 

print new_df1 
print new_df2 

Dies ist die gewünschte Ausgabe:

A   str2  
-0.152686 -0.823674 
-1.272144 0.319550 

A  
0.310152 
1.046044 

diesem Beispiel der Einfachheit halber ist. Ich werde mehr als 100 CSV-Dateien durchlaufen, um nur bestimmte Spalten zu behalten.

Antwort

1

können Sie filter() Funktion in Verbindung mit RegEx verwenden:

In [79]: mask = r'^(?:A|str2)$' 

In [80]: df1.filter(regex=mask) 
Out[80]: 
      A  str2 
0 -1.190226 -0.123637 
1 -1.782685 0.219820 

In [81]: df2.filter(regex=mask) 
Out[81]: 
      A 
0 0.207736 
1 -0.013273 
+0

Danke für die schnelle Antwort! Obwohl dies mein Posted-Beispiel gelöst hat, brauche ich die Regex, um genau übereinzustimmen, anstatt die Zeichenfolge 'Wenn enthält'. Ich versuchte r '(?:) \ B (A | str2) \ b', aber das funktionierte nicht für meine eigentliche Anwendung, da ich mehrere Überschriften habe, die sehr ähnlich sind, aber sich nur durch ein Zeichen oder Interpunktion unterscheiden. –

+0

@ JordanChristian, ich habe meine Antwort aktualisiert - bitte überprüfen Sie – MaxU

+0

Das funktioniert. Vielen Dank! –

0

Sie können eine Liste Verständnis verwenden, um eine Liste aller Spaltenüberschriften zu erzeugen, die in keep_col sind.

new_df1 = df1[[c for c in df1.columns if c in keep_col]] 
new_df2 = df1[[c for c in df2.columns if c in keep_col]] 

print new_df1 
>>> 
      A  str2 
0 1.480978 0.369485 
1 -0.969107 0.767707 

print new_df2 
>>> 
      A 
0 1.480978 
1 -0.969107 
+0

vielen Dank. Das hat den Trick gemacht. –