2017-07-27 6 views
0

Hallo alle so eine Reihe von Spalten zu löschen gegeben Ich versuche, dass die erste Spalte das Wort ‚Meer‘ hatTropfen Spaltenbereich basierend auf String in Spalte

1 | 2 | 3 | 4 | 5 
10 'sea'   48 
15 11 23 25 26 
28 26 14 9 21 

In [14]: df.columns 
Out [14]: Index([0,1,2,3,4,5,6,7],dtype = 'object') 

der Ausgang I zu erreichen versuchen:

1 | 5 
10 48 
15 26 
28 21 

der Code i so weit haben, da meine Spaltenüberschriften ganze Zahlen sind:

for c in df.columns: 
    if df[c].str.contains(pat = 'Sea'): 
     df.drop(df.columns[[range(c,c+2)]],axis=1,inplace=True) 

dies jedoch kehrt die Fehler eines mehrdeutigen Wahrheitswerts. Jede Hilfe ist willkommen

+0

Zeigen Sie die Ausgabe von df.columns des ursprünglichen Datenrahmens. Vielen Dank. –

+0

@ScottBoston Ich habe meinen Beitrag bearbeitet, um ihn einzuschließen – codeninja

Antwort

0

Ändern Sie Ihre zweite Zeile:

if any(df[c].str.contains(pat = 'Sea')): 

df.str.contains gibt eine Liste von Booleschen Werte, die angeben, ob die Bedingung wahr oder falsch ist für jede Zeile. Das ist der Ursprung des mehrdeutigen Wahrheitswertfehlers. Mit der any() -Funktion konvertieren Sie die Liste in einen booleschen Wert.

Update:

Auch Sie 3 Spalten auf einmal löschen, wenn Sie das ‚Meer‘ gefunden und danach die Schleife will mit den gelöschten Spalten fortzusetzen, damit der Schlüsselfehler. Versuchen Sie, diese als 3. Zeile:

df.drop(df.columns[c],axis=1,inplace=True) 
+0

@cmaher So ich den Code ausführen, und es gibt mir einen KeyError, aber wenn ich den Datenframe überprüfen, wurde der richtige Spaltenbereich gelöscht. Irgendwelche Tipps, um das zu versöhnen? – codeninja

0

würde ich np.where verwenden, um festzustellen, wo die beanstandeten Säulen waren

i = np.where((df.values == 'sea').any(0))[0] 
cat = np.concatenate([range(c, c + 3) for c in df.columns[i]]) 
df.drop(np.unique(cat), 1) 

    1 5 
0 10 48 
1 15 26 
2 28 21 
0
for num in range(len(df)): 
    for i in range(len(df.columns)-6): #for countries and id 
     if pd.Series.any(sh1[num].iloc[:,i].str.contains(pat="Sea")): 
      df.drop([df].columns[i],df.columns[i+1], 
      df.columns[i+2]],axis=1,inplace=True) 

ist das, was für mich gearbeitet. Fühlen Sie sich frei, den Code aufzuräumen/schlagen Sie einen effizienten Weg vor, um es zu tun

Verwandte Themen