使用python清理大数据

Kat*_*mar 6 python pandas

我必须在python中清理输入数据文件.由于拼写错误,数据字段可能包含字符串而不是数字.我想识别所有字符串,并使用pandas用NaN填充这些字段.另外,我想记录这些字段的索引.

最原始的方法之一是循环遍历每个字段并检查它是否是数字,但如果数据很大,则会耗费大量时间.

我的csv文件包含类似于下表的数据:

Country  Count  Sales
USA         1   65000
UK          3    4000
IND         8       g
SPA         3    9000
NTH         5   80000
Run Code Online (Sandbox Code Playgroud)

....假设我在数据中有60,000个这样的行.

理想情况下,我想确定IND行在SALES列下的值无效.有关如何有效地做到这一点的任何建议?

And*_*den 10

有一个na_values论点read_csv:

na_values:list-like或dict,default None
       要识别为NA/NaN的其他字符串.如果dict通过,则具体的每列NA值

df = pd.read_csv('city.csv', sep='\s+', na_values=['g'])

In [2]: df
Out[2]:
  Country  Count  Sales
0     USA      1  65000
1      UK      3   4000
2     IND      8    NaN
3     SPA      3   9000
4     NTH      5  80000
Run Code Online (Sandbox Code Playgroud)

使用时pandas.isnull,您只能选择列中包含NaN的行'Sales''Country'系列:

In [3]: df[pd.isnull(df['Sales'])]
Out[3]: 
  Country  Count  Sales
2     IND      8    NaN

In [4]: df[pd.isnull(df['Sales'])]['Country']
Out[4]: 
2    IND
Name: Country
Run Code Online (Sandbox Code Playgroud)

如果它已经在DataFrame中,您可以使用apply将这些数字的字符串转换为整数(使用str.isdigit):

df = pd.DataFrame({'Count': {0: 1, 1: 3, 2: 8, 3: 3, 4: 5}, 'Country': {0: 'USA', 1: 'UK', 2: 'IND', 3: 'SPA', 4: 'NTH'}, 'Sales': {0: '65000', 1: '4000', 2: 'g', 3: '9000', 4: '80000'}})

In [12]: df
Out[12]: 
  Country  Count  Sales
0     USA      1  65000
1      UK      3   4000
2     IND      8      g
3     SPA      3   9000
4     NTH      5  80000

In [13]: df['Sales'] = df['Sales'].apply(lambda x: int(x) 
                                                  if str.isdigit(x)
                                                  else np.nan)

In [14]: df
Out[14]: 
  Country  Count  Sales
0     USA      1  65000
1      UK      3   4000
2     IND      8    NaN
3     SPA      3   9000
4     NTH      5  80000
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 5

import os
import numpy as np
import pandas as PD

filename = os.path.expanduser('~/tmp/data.csv')
df = PD.DataFrame(
        np.genfromtxt(
            filename, delimiter = '\t', names = True, dtype = '|O4,<i4,<f8'))
print(df)
Run Code Online (Sandbox Code Playgroud)

产量

  Country  Count  Sales
0     USA      1  65000
1      UK      3   4000
2     IND      8    NaN
3     SPA      3   9000
4     NTH      5  80000
Run Code Online (Sandbox Code Playgroud)

要找到NaN销售国家,你可以计算

print(y['Country'][np.isnan(y['Sales'])])
Run Code Online (Sandbox Code Playgroud)

产生了pandas.Series:

2    IND
Name: Country
Run Code Online (Sandbox Code Playgroud)