熊猫:干净&将DataFrame转换为数字

时间:2017-03-20 08:35:16

标签: python pandas numpy dataframe

我有一个包含字符串的数据框,从一个草率的csv:

中读取
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   

我想做什么:将帧中的每个单元格转换为数字。它应该忽略空格,但是将NaN放在细胞包含非常奇怪的东西的地方。 我可能知道如何使用非常不可靠的手动循环和替换值来做到这一点,但是想知道是否有一个很好的,干净的为什么这样做。

1 个答案:

答案 0 :(得分:2)

您可以将read_csv与正则表达式分隔符\s{2,} - 2个或更多空格和参数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

然后,如果有必要,apply函数to_numeric带参数errors='coerce' - 它会将非数字替换为NaN

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