2016-08-09 15 views
3

Ich habe eine Pandas Dataframe, die 46 Spalten und 6 Zeilen hat.Pandas aktualisieren Datenrahmen Werte, wenn Zelle enthält '-'

Index Column1 Column2 Column3 Column4  ... # Cant type all 46 columns. 
2012  5626  fooo  -   barrr 
2013  5655h  booo  -   barr 
2014  5626d  zooo  -   - 
LTM  56   gooo  greed  - 

Gibt es eine Möglichkeit für mich durch diesen Datenrahmen zu gehen und aktualisieren all - Werte 0 oder null Werte sein?

Ich habe versucht:

for zzz in df.columns: # since df.columns will return me the names of the columns 
    if df_final[zzz].any() == '-': 
     df_final[zzz] = 0 
     print(df_final) 

Dies ist jedoch nur alles druckt, wie es ist. es konvertiert nicht - in 0/null

+1

Auch wenn Ihr Code funktionieren würde, ist es die falsche Semantik, da sie die gesamte Spalte auf "0" aktualisiert hätte. Sie haben auch nicht angezeigt, was 'df_final' in Ihrem Code-Snippet ist – EdChum

+0

@jake, Suggestion: vermeiden Schleifen. Vermeiden Sie es, Ihre DataFrames so zu codieren, dass sie in Schleifen arbeiten, die Ihnen keine Ergebnisse liefern. Python hat eine andere Art, Namen zu handhaben, und die Dinge sind von nirgendwo veränderbar. Und Pandas geben fast immer eine Kopie zurück, so dass Änderungen keine Auswirkungen auf die Eltern haben. Verwenden Sie die DataFrame-Methoden. Lies die Pandas-Dokumentation, wie das geht. – Kartik

Antwort

4

Verwendung replace diesen spezifischen Wert durch ein anderes zu ersetzen:

In [71]: 
df.replace('-',0, inplace=True) 
df 

Out[71]: 
    Index Column1 Column2 Column3 Column4 
0 2012 5626 fooo  0 barrr 
1 2013 5655h booo  0 barr 
2 2014 5626d zooo  0  0 
3 LTM  56 gooo greed  0 

Ihr Code auch wenn es gearbeitet haben würde ist die falsche Semantik:

for zzz in df.columns: 
    if df_final[zzz].any() == '-': 
     df_final[zzz] = 0 
     print(df_final) 

dies: df_final[zzz] = 0 die gesamte Spalte aktualisiert haben würde

wenn Ihr Code war:

for zzz in df.columns: 
    if df_final[zzz].any() == '-': 
     df_final[zzz] = df_final[zzz].replace('-',0) 
     print(df_final) 

dann wäre dies die Zeilen nur ersetzen haben, der die Bedingung erfüllt, könnten Sie haben auch getan:

df.apply(lambda x: x.replace('-',0)) 

eine kompaktere Methode

EDIT wenn Sie ersetzen möchten mit NaN dann pass np.NaN anstelle von 0 oben.

+1

Er möchte wahrscheinlich ersetzen Sie es mit' np.nan' basierend auf dieser Frage: http://StackOverflow.com/Questions/38845435/Can-i-Create-a-Loop-to-Update- sql-database Im Grunde scheint es, dass er eine komplette Datenverarbeitungspipeline direkt aus dem Scraping von Daten von einem Webserver erstellen muss: http://stackoverflow.com/questions/38810575/merging-dataframes-that-was-boved-via- Web-Scraping zum Einfügen der resultierenden DataFrame in eine SQL-DB ... – Kartik

+0

@Ed, meine Sie die Antwort ... – Kartik

+0

@Kartik ja Antwort, Entschuldigung Auto-Eingabe-Antworten ohne zu lesen – EdChum

3

Sie replace verwenden können:

print (df.replace({'-': 0})) 
    Index Column1 Column2 Column3 Column4 
0 2012 5626 fooo  0 barrr 
1 2013 5655h booo  0 barr 
2 2014 5626d zooo  0  0 
3 LTM  56 gooo greed  0 
+0

danke für die Antwort –

+0

Ich bin neugierig. Wenn wir sagen, 'Column1' Werte sind in einer Klammer, zB:' (5626) '. Kann ich stattdessen die Funktion '.replace' verwenden, um sie in' -5626' zu ändern? –

+0

Ich denke ja. Am besten ist die Verwendung eines kleinen Beispieldatenrahmens und das Testen desselben - z.B. benutze 'df = pd.DataFrame ({'Column1': ['(5626)', 'aa', ''], 'B': [4,5,6], 'C': [7,8 , 9]}) ' – jezrael