2016-03-27 9 views
1

"rating.dat" dosyasında aşağıdaki kodu çalıştırdıktan sonra "ValueError" yaşıyorum. Aynı kodu başka bir dosyada "," ile herhangi bir sorun olmadan ayırıcı olarak denedim. Ancak, ayırıcılar "::" olduğunda pandalar başarısız oluyor.Pandalar'da değer hatası read_csv üzerindeki "::" ayırıcıda

Kodu yanlış mı yazdım?

Kodu:

import pandas as pd 
import numpy as np 

r_cols = ['userId', 'movieId', 'rating'] 
r_types = {'userId': np.str, 'movieId': np.str, 'rating': np.float64} 
ratings = pd.read_csv(
     r'C:\\Users\\Admin\\OneDrive\\Documents\\_Learn!\\' 
     r'Learn Data Science\\Data Sets\\MovieLens\\ml-1m\\ratings.dat', 
     sep='::', names=r_cols, usecols=range(3), dtype=r_types 
     ) 

m_cols = ['movieId', 'title'] 
m_types = {'movieId': np.str, 'title': np.str} 
movies = pd.read_csv(
     r'C:\\Users\\Admin\\OneDrive\\Documents\\_Learn!\\' 
     r'Learn Data Science\\Data Sets\\MovieLens\\ml-1m\\movies.dat', 
     sep='::', names=m_cols, usecols=range(2), dtype=m_types 
     ) 

ratings = pd.merge(movies, ratings) 
ratings.head() 

"ratings.dat"

1::1287::5::978302039 
1::2804::5::978300719 
1::594::4::978302268 
1::919::4::978301368 
1::595::5::978824268 

Hata Çıktı:

---------------------------------------------------------------------------ValueError        Traceback (most recent call last)<ipython-input-19-a2649e528fb9> in <module>() 
     7   r'C:\\Users\\Admin\\OneDrive\\Documents\\_Learn!\\' 
     8   r'Learn Data Science\\Data Sets\\MovieLens\\ml-1m\\ratings.dat', 
----> 9   sep='::', names=r_cols, usecols=range(3), dtype=r_types 
    10  ) 
    11 
C:\Anaconda3\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, dialect, compression, doublequote, escapechar, quotechar, quoting, skipinitialspace, lineterminator, header, index_col, names, prefix, skiprows, skipfooter, skip_footer, na_values, true_values, false_values, delimiter, converters, dtype, usecols, engine, delim_whitespace, as_recarray, na_filter, compact_ints, use_unsigned, low_memory, buffer_lines, warn_bad_lines, error_bad_lines, keep_default_na, thousands, comment, decimal, parse_dates, keep_date_col, dayfirst, date_parser, memory_map, float_precision, nrows, iterator, chunksize, verbose, encoding, squeeze, mangle_dupe_cols, tupleize_cols, infer_datetime_format, skip_blank_lines) 
    496      skip_blank_lines=skip_blank_lines) 
    497 
--> 498   return _read(filepath_or_buffer, kwds) 
    499 
    500  parser_f.__name__ = name 
C:\Anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds) 
    273 
    274  # Create the parser. 
--> 275  parser = TextFileReader(filepath_or_buffer, **kwds) 
    276 
    277  if (nrows is not None) and (chunksize is not None): 
C:\Anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds) 
    584 
    585   # might mutate self.engine 
--> 586   self.options, self.engine = self._clean_options(options, engine) 
    587   if 'has_index_names' in kwds: 
    588    self.options['has_index_names'] = kwds['has_index_names'] 
C:\Anaconda3\lib\site-packages\pandas\io\parsers.py in _clean_options(self, options, engine) 
    663       msg += " (Note the 'converters' option provides"\ 
    664        " similar functionality.)" 
--> 665      raise ValueError(msg) 
    666     del result[arg] 
    667 
ValueError: Falling back to the 'python' engine because the 'c' engine does not support regex separators, but this causes 'dtype' to be ignored as it is not supported by the 'python' engine. (Note the 'converters' option provides similar functionality.) 

cevap

3

Eğer son satırı okursanız Geri tepme dikkatlice, neden başarısız olduğunu cevap alabilirsiniz. Ben So ayırıcı '::' normal ifade olarak yorumlanır iki çizgi

ValueError: Falling back to the 'python' engine because the 'c' engine does not support regex separators,

but this causes 'dtype' to be ignored as it is not supported by the 'python' engine. (Note the 'converters' option provides similar functionality.)

içine tükürmek ettik. Pandalar belgelerine yaklaşık sep dediği gibi:

Regular expressions are accepted and will force use of the python parsing engine

Böylece (vurgu benim), Pandalar veri okumak için "Python motoru" kullanacaktır. Hatanın sonraki satırı, Python motorunun bu kullanımı nedeniyle dtype'un yok sayıldığını söylüyor. (Tahminen, C-motor d_type kullanabilecekleri, numpy anlamına gelir; Python besbelli dtypes ile uğraşmaz.)


o

Ya den dtype argüman kaldırmak olabilir çözmek için nasıl read_csv numaralı telefona çağrı (hala bir uyarı alırsınız) veya ayırıcı hakkında bir şeyler yapın.

İkinci seçenek zor görünüyor: kaçmak veya ham bir dize yardımcı olmuyor. Görünüşe göre, 1 karakterden uzun herhangi bir ayırıcı Pandalar tarafından düzenli bir ifade olarak yorumlanır. Bu şeylerin Pandalar tarafında talihsiz bir karar olabilir.

Tüm bunlardan sakınmanın bir yolu, bir ':' ayırıcı olarak kullanmak ve diğer (boş) sütunlardan kaçınmaktır. Örneğin:

ratings = pd.read_csv(filename, sep=':', names=r_cols, 
         usecols=[0, 2, 4], dtype=r_types) 

(veya range kullanımıyla ilgili ayarlanmadıklarını usecols=range(0, 5, 2) kullanın.)


Ek

OP doğru tek : karakteri olan bir alanla ilgili noktasını yükseltir . Belki de bu etrafında bir yol yoktur, ama aksi takdirde yerine numpy en genfromtxt kullanarak, bunu bir iki adımlı bir yaklaşım yapabilirsiniz: veri kayıtlarının

# genfromtxt requires a proper numpy dtype, not a dict 
# for Python 3, we need U10 for strings 
dtype = np.dtype([('userId', 'U10'), ('movieID', 'U10'), 
        ('rating', np.float64)]) 
data = np.genfromtxt(filename, dtype=dtype, names=r_cols, 
        delimiter='::', usecols=list(range(3))) 
ratings = pd.DataFrame(data) 
+0

Bir tek vardır ":" veri alanı içinde.Bu nedenle, Python bir C hatası atmaya devam ediyor: "12 satırında 5 alan bekleniyor, 6" gördüm. Bununla başa çıkacak bir şey var mı? – Cloud

+0

Bu noktada, muhtemelen bir metin düzenleyicideki veri dosyasını açabilirim, bkz. dosyadaki herhangi bir virgül veya yarı-virgül ve ',' ile '-' için bir-yerine koy. Tabii ki dosyaya erişimim var. – Evert

+0

@Cloud Durumunuz hakkında Pandas posta listesinde ('önlemek' nasıl) '' '' düzenli bir ifade olarak yorumlanırken, bunu test ettiğimde ters eğiklikler çalışmadı ya da Pandas github'da bir sorunla karşılaşmak isteyebilirsiniz. sayfa. – Evert

İlgili konular