2016-10-23 4 views
1

Ich reinig einige menschliche klassifizierte Daten mit Python 2.7, hauptsächlich mit Pandas, aber mit numpy.isreal() auf Floats zu überprüfen, weil einige Leute anscheinend in Felder wie 'background_color' Float eingegeben. Wie auch immer, ich poste ein Beispiel dafür, wie es für eine Farbe mit meiner aktuellen Einrichtung aussehen würde, die funktioniert, sieht am Ende der Schleifen nicht sehr Python aus, blues ist eine Liste aller Indizes wo background_color Fall war unempfindlich 'BLUE':Machen Sie diese Daten Reinigungsschleife mehr Python

blueShapes=[] 
for i in range(imageData.shape[0]): 
    if not (np.isreal(imageData.loc[i,'background_color'])): 
     if imageData.loc[i,'background_color'].upper()=='BLUE': 
      blueShapes.append(i) 

Es scheint, wie ich die Kartenfunktion nutzen könnte diese mehr Pythonic und bisschen besser zu machen. Wie gesagt, es funktioniert wie beabsichtigt, scheint aber auch ... C oder Java, damit es in Python geschrieben werden kann. Vielen Dank im Voraus für alle Antworten.

-Edit: entfernte ich die Zählung, weil es ein Relikt aus einer alten Schleife

+0

'count = len (blueShapes)' sollten Sie einige 'chars' – Wasi

Antwort

0

war man

imageData['background_color_2'] = map(lambda x: x.upper(), imageData['background_color'].astype(str)) 

subset = imageData[imageData['background_color_2']=='BLUE'] 

für die Zählung

len(subset['background_color']) 
+0

Bist du sicher, speichere ich gewonnen; t in einen Fehler laufen, wenn i' .astype (str) rufen 'auf einem String-Objekt? – ThisGuyCantEven

+0

Raten Sie nicht, es gab eine Ausnahme, wenn ich versuchte, das ohne 'Lambda' zu verwenden. – ThisGuyCantEven

+0

Ich wünschte, ich hätte genug Rep zum upvote, Danke! – ThisGuyCantEven

0

eine bew Säule mit oberen Fälle schaffen könnte Sie können eine Lambda-Funktion definieren, die den Index von Zeilen mit einem bestimmten Zeichenfolgenwert

zurückgibt
0

Als allgemeine Regel, wenn Sie in Pandas Schleifen sind Sie tun es falsch.

sollte wie folgt aussehen (wenn auch nicht getestet, so müssen Sie es anpassen!):

strings = (~imageData.background_color.apply(np.isreal)) 
blue = (imageData.background_color.str.upper()=="BLUE") 
blueshapes = imageData[strings & blue].index   
0

Dank all! Ich habe eine kleine Anpassung an die Antwort von Steven G verwendet, ich habe all dies in einem Master-CSV gesichert, also hatte ich keine Quests, bei denen ich einfach die background_color-Spalte mit ihrem String-Äquivalent überschrieben habe. Alle nicht sinkenden Einträge sind sowieso ungültig, aber sie sind nicht allein, also werde ich sie später als übrig gebliebene Indizes finden, nachdem ich die Indizes aller Farben verkettet habe. Jede Liste wird wie folgt extrahiert:

imageData['background_color']=map(lambda x: x.upper(), imageData['background_color'].astype(str)) 

blueShapes=imageData[imageData['background_color']=='BLUE'].index 
0

Ich würde es in eine Funktion verwandeln und ein Array zurückgeben.

Google: Zen of Python

Geben Sie einen schnellen Überblick python list/dict/set over map/filter.

Bessere Lesbarkeit und sauberer Code.

def colorShapes(color): 
    return [i 
      for i in range(imageData.shape[0]) 
      if not(np.isreal(imageData.loc[i, 'background_color'].upper() == color 
      and imageData.loc[i, 'background_color'].upper() == color]