2014-06-09 59 views
1

我有4個文件,我想用Python /熊貓讀取,文件是:https://github.com/kelsey9649/CS8370Group/tree/master/TaFengDataSet 我剝離了所有4個文件中的第一行(中文列標題)。 但是除此之外,這4個文件應該具有相同的格式。調查熊貓數據框中的不同數據類型

現在我想閱讀它們併合併成一個大的DataFrame。我嘗試了用

pars = {'sep':   ';', 
      'header':  None, 
      'names':  ['date','customer_id','age','area','prod_class','prod_id','amount','asset','price'], 
      'parse_dates': [0]} 

df = pd.DataFrame() 
for i in ('01', '02', '12', '11'): 
    df = df.append(pd.read_csv(cfg.abspath+'D'+i,**pars)) 

BUT:文件D11給我一個列的格式不同,因此無法正確合併。該文件包含超過200k行,因此我不能輕易地查找該文件中的問題,但如上所述,我假設它具有相同的格式,但顯然在格式上有一些小的差異。

現在調查問題的最簡單方法是什麼?顯然,我無法檢查該文件中的每一行...

當我讀取3個工作文件併合並它們;讀D11 independetly,行

A = pd.read_csv(cfg.abspath+'D11',**pars) 

仍然給我以下警告:

C:\Python27\lib\site-packages\pandas\io\parsers.py:1130: DtypeWarning: Columns (
1,4,5,6,7,8) have mixed types. Specify dtype option on import or set low_memory= 
False. 
    data = self._reader.read(nrows) 

在熊貓使用方法.info()(爲Adf)產量:

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 594119 entries, 0 to 178215 
Data columns (total 9 columns): 
date   594119 non-null datetime64[ns] 
customer_id 594119 non-null int64 
age   594119 non-null object 
area   594119 non-null object 
prod_class  594119 non-null int64 
prod_id  594119 non-null int64 
amount   594119 non-null int64 
asset   594119 non-null int64 
price   594119 non-null int64 
dtypes: datetime64[ns](1), int64(6), object(2) 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 223623 entries, 0 to 223622 
Data columns (total 9 columns): 
date   223623 non-null object 
customer_id 223623 non-null object 
age   223623 non-null object 
area   223623 non-null object 
prod_class  223623 non-null object 
prod_id  223623 non-null object 
amount   223623 non-null object 
asset   223623 non-null object 
price   223623 non-null object 

即使如果我在導入時使用dtype選項,我會以某種方式仍然害怕錯誤/不好的結果,因爲可能發生一些錯誤的da tatypes在導入時!?

如何克服和解決這個問題? 非常感謝

回答

2

只要你有一個問題,就是太無聊了由手工完成,解決的辦法是寫一個程序:

for col in ('age', 'area'): 
    for i, val in enumerate(A[col]): 
     try: 
      int(val) 
     except: 
      print('Line {}: {} = {}'.format(i, col, val)) 

這將顯示與非文件中的所有行整數值在agearea列中。這是調試問題的第一步。一旦你知道有問題的值是什麼,你可以更好地決定如何處理它們 - 也許可以通過預處理(清理)數據文件,或者使用一些熊貓代碼來選擇和修復有問題的值。

+0

是的,幫助了我,謝謝。但我必須以其他方式實現它,因爲我需要檢查整數列(年齡和區域實際上是(當正確提供的時候)字符/字符串)。 – tim