Ho molti file CSV con gli stessi titoli di colonne da analizzare. In questi file, ci possono essere diversi pattern per rappresentare NA, ad esempio: "-", "-", "/", ...Come convertire rapidamente le colonne in numeri senza conoscere i modelli di valori NA
Non conosco tutti gli schemi, quindi non posso impostare Argomento na_values
per read_csv()
correttamente.
C'è un modo rapido per trovare tutti i pattern NA in questi file, o senza conoscere tutti i pattern, posso ancora convertire tutte le colonne in numero? Ecco cosa ho provato:
patterns = set()
for i, fn in enumerate(glob(u"data/*.csv")):
df = pd.read_csv(fn, encoding="utf-8-sig", usecols=cols, dtype=str, keep_default_na=False)
df_num = df.convert_objects(convert_numeric=True)
patterns.update(df[df_num.isnull()].stack().value_counts().index)
Ma convert_objects()
è lento. Ecco alcune prove:
read_csv(dtype=str)
: circa 2.2sread_csv()
senzadtype
argomento: circa 2.5sread_csv(dtype=str)
+convert_objects()
: 8.4s
Quindi, read_csv()
può convertire le stringhe in numeri molto rapidamente di convert_objects()
. Ma se c'è un elemento che non può essere convertito in numero, l'intera colonna diventerà una colonna di stringhe.
Esistono metodi più veloci che possono convertire tutte le colonne in numeri senza impostare l'argomento na_values
?
Non potresti semplicemente passare tutti i valori possibili noti per 'NaN' a' na_values'? Altrimenti, penso che sei bloccato con i tuoi attuali metodi – EdChum
numpy .astype (float) è più veloce? – dmargol1