pandas.DataFrame.astype(float)
erhöht ValueError: could not convert string to float
Fehler.Wie finde ich heraus, welche Zellen nicht in Float konvertiert werden konnten?
Was ist der beste Weg zu finden, welche Zelle (n) das verursacht hat?
pandas.DataFrame.astype(float)
erhöht ValueError: could not convert string to float
Fehler.Wie finde ich heraus, welche Zellen nicht in Float konvertiert werden konnten?
Was ist der beste Weg zu finden, welche Zelle (n) das verursacht hat?
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
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
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
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
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.
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
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
'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
Ja, gib mir eine Sekunde. – jezrael
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