2017-03-20 3 views
1

Ich habe einen Datenrahmen Zeichenketten enthalten, wie aus einem schlampig csv lesen:Pandas: sauber und konvertieren Datenrahmen zu Zahlen

id Total   B     C  ...           
0 56 974   20 739    34 482 
1 29 479   10 253    16 704 
2 86 961   29 837    43 593 
3 52 687   22 921    28 299 
4 23 794   7 646    15 600 

Was ich tun möchte: jede Zelle im Rahmen in eine Zahl konvertieren. Es sollte Whitespaces ignorieren, aber NaN, wo die Zelle etwas wirklich seltsames enthält. Ich weiß wahrscheinlich, wie man es mit schrecklichen unperformanten manuellen Schleifen und Ersetzen von Werten macht, aber fragte mich, ob es einen schönen und sauberen Grund gibt, dies zu tun.

Antwort

2

können Sie verwenden read_csv mit regex Separator \s{2,}-2 oder mehr Leerzeichen und Parameter thousands:

import pandas as pd 
from pandas.compat import StringIO 

temp=u"""id Total   B     C           
0 56 974   20 739    34 482 
1 29 479   10 253    16 704 
2 86 961   29 837    43 593 
3 52 687   22 921    28 299 
4 23 794   7 646    15 600 """ 
#after testing replace 'StringIO(temp)' to 'filename.csv' 
df = pd.read_csv(StringIO(temp), sep="\s{2,}", engine='python', thousands=' ') 

print (df) 
    id Total  B  C 
0 0 56974 20739 34482 
1 1 29479 10253 16704 
2 2 86961 29837 43593 
3 3 52687 22921 28299 
4 4 23794 7646 15600 

print (df.dtypes) 
id  int64 
Total int64 
B  int64 
C  int64 
dtype: object 

Und dann ggf. apply Funktion to_numeric mit dem Parameter errors='coerce' - ersetzen nicht numerisch NaN:

df = df.apply(pd.to_numeric, errors='coerce') 
Verwandte Themen