2016-05-22 2 views

Antwort

2

Ich denke, Sie können zuerst fillna mit einer Nummer, z.B. 1, apply Funktion to_numeric mit Parameter errors='coerce' und wenn der Wert nicht konvertiert werden kann, wird durch NaN gefüllt. Dann überprüfen Sie isnull mit any. Letzte Verwendung boolean indexing zum Suchen von Spalten und Index mit NaN Werte - es bedeutet, dass es offensichtlich string Werte oder andere Werte, die nicht in numerische konvertiert werden können.

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A':['a','b','',5], 
        'B':[4,5,6,5], 
        'C':[np.nan,8,9,7]}) 

print (df) 
    A B C 
0 a 4 NaN 
1 b 5 8.0 
2  6 9.0 
3 5 5 7.0 
a = (df.fillna(1).apply(lambda x: pd.to_numeric(x, errors='coerce'))) 
print (a) 
    A B C 
0 NaN 4 1.0 
1 NaN 5 8.0 
2 NaN 6 9.0 
3 5.0 5 7.0 

b = (pd.isnull(a)) 
print (b) 
     A  B  C 
0 True False False 
1 True False False 
2 True False False 
3 False False False 
print (b.any()) 
A  True 
B False 
C False 
dtype: bool 

print (b.any()[b.any()].index) 
Index(['A'], dtype='object') 

print (b.any(axis=1)) 
0  True 
1  True 
2  True 
3 False 
dtype: bool 

print (b.any(axis=1)[b.any(axis=1)].index) 
Int64Index([0, 1, 2], dtype='int64') 

#df is not modified 
print (df) 
    A B C 
0 a 4 NaN 
1 b 5 8.0 
2  6 9.0 
3 5 5 7.0 
+0

'astype (float)' würde 'ValueError' nicht auslösen, wenn ein 'float (' nan ')' im ursprünglichen 'DataFrame' vorhanden ist. Auf diese Weise kann ich falsche positive Ergebnisse erhalten: Dieser Code unterscheidet sich nicht vom ursprünglichen 'float ('nan') 'von denen, die durch' to_numeric 'erzeugt wurden. – max

+0

Ja, gib mir eine Sekunde. – jezrael

+0

Btw, ich habe bemerkt, dass es Unterschiede gibt was "astype (float)" und "to_numeric" kann. 'astype (float)' würde 'ValueError' auf einer leeren Zeichenkette auslösen, während' pd.to_numeric' es standardmäßig in 'NaN' umwandelt (auch ohne' errors = 'coerce''). Dies verursacht jedoch kein Problem mit Ihrem Code. Dennoch ist es komisch, und es würde in einigen Fällen sicherlich die Logik beeinflussen. In der Tat hatte ich in meinem Fall eine Reihe von 'float ('nan')' und ein paar leere Saiten :) – max

0

Sie dtype Attribut verwenden können, um den Datentyp von numpy Objekt zu finden. für zB

df = pd.DataFrame([[1.9, 2.987, 'abcd',1]]) 
result = df.dtypes == np.float64 

Diese eine Typ boolean Ausgabe von wo generieren Sie leicht

result 
0  True 
1  True 
2 False 
3 False 
dtype: bool 

Der obige Ausgang eindeutig vergleichen können, dass das Element mit dem Index 2 & 3 Sie nicht float type

+0

Wird 'astype' nicht versuchen, in' float' zu konvertieren? Wie wäre es mit einer Saite "4.5", würde sie nicht einfach in "4.5" umgewandelt? – max

+0

können Sie überprüfen, ob Zeichenfolgen, die nicht konvertiert werden konnten, 'NaN' sind? Wie für die NaN-Werte müssen Sie angeben, wie sie konvertiert werden sollen, aber Sie können dazu die Methode '.fillna' verwenden. – Tanu

0

ist könnte einfach über die Zellen mit Hilfe von Indizes iterieren und den Fehler folgendermaßen abfangen:

for r in range(df_rows): 
    for c in range(df_cols): 
     try: 
      float(df[r][c]) 
     except ValueError: 
      print("Conversion error at coordinates", r, c) 

Ich schließe die Schleife nicht ab, da Sie alle Problemzellen sehen möchten, und möglicherweise mehrere.

+0

Ich hoffte, die for-Schleifen zu vermeiden, da der 'DataFrame' riesig ist. Aber das sollte funktionieren. Ich denke, du musst 'benutzen.Iloc 'obwohl; Wenn die Indizes Zufallszahlen haben, ist die Iteration falsch. – max

+0

Ich benutze keine Pandas, also ist dies ein allgemeiner Vorschlag - und hat den Vorteil der Einfachheit, oder zumindest dachte ich das. Fühlen Sie sich frei, meine Antwort zu korrigieren. – alexis

Verwandte Themen