So. Mamy dane w postaci bałaganu zapisane w pliku TSV, które muszę zanalizować. Jak to wyglądaPython. Pandy. BigData. Brudny plik TSV. Jak pozbyć się danych?
status=200 protocol=http region_name=Podolsk datetime=2016-03-10 15:51:58 user_ip=0.120.81.243 user_agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 user_id=7885299833141807155 user_vhost=tindex.ru method=GET page=/search/
A problem jest to, że niektóre wiersze mają różną kolejność kolumn/niektóre z nich brakujących wartości i muszę pozbyć się, że o wysokiej wydajności (od zbiorów danych pracuję z są do 100 gigabajtów).
Data = pd.read_table('data/data.tsv', sep='\t+',header=None,names=['status', 'protocol',\
'region_name', 'datetime',\
'user_ip', 'user_agent',\
'user_id', 'user_vhost',\
'method', 'page'], engine='python')
Clean_Data = (Data.dropna()).reset_index(drop=True)
Teraz Pozbyłem brakujących wartości, ale jeden problem nadal! ten sposób dane wygląda:
Jak widać niektóre kolumny są przesunięte. zrobiłem rozwiązanie bardzo niskiej wydajności
ids = Clean_Data.index.tolist()
for column in Clean_Data.columns:
for row, i in zip(Clean_Data[column], ids):
if np.logical_not(str(column) in row):
Clean_Data.drop([i], inplace=True)
ids.remove(i)
Więc teraz Dane wygląda dobrze ... przynajmniej mogę z nim pracować! Ale jaka jest ALTERNATYWA o wysokiej wydajności do metody, którą wykonałem powyżej?
Aktualizacja kodu unutbu: error traceback
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-52c9d76f9744> in <module>()
8 df.index.names = ['index', 'num']
9
---> 10 df = df.set_index('field', append=True)
11 df.index = df.index.droplevel(level='num')
12 df = df['value'].unstack(level=1)
/Users/Peter/anaconda/lib/python2.7/site-packages/pandas/core/frame.pyc in set_index(self, keys, drop, append, inplace, verify_integrity)
2805 if isinstance(self.index, MultiIndex):
2806 for i in range(self.index.nlevels):
-> 2807 arrays.append(self.index.get_level_values(i))
2808 else:
2809 arrays.append(self.index)
/Users/Peter/anaconda/lib/python2.7/site-packages/pandas/indexes/multi.pyc in get_level_values(self, level)
664 values = _simple_new(filled, self.names[num],
665 freq=getattr(unique, 'freq', None),
--> 666 tz=getattr(unique, 'tz', None))
667 return values
668
/Users/Peter/anaconda/lib/python2.7/site-packages/pandas/indexes/range.pyc in _simple_new(cls, start, stop, step, name, dtype, **kwargs)
124 return RangeIndex(start, stop, step, name=name, **kwargs)
125 except TypeError:
--> 126 return Index(start, stop, step, name=name, **kwargs)
127
128 result._start = start
/Users/Peter/anaconda/lib/python2.7/site-packages/pandas/indexes/base.pyc in __new__(cls, data, dtype, copy, name, fastpath, tupleize_cols, **kwargs)
212 if issubclass(data.dtype.type, np.integer):
213 from .numeric import Int64Index
--> 214 return Int64Index(data, copy=copy, dtype=dtype, name=name)
215 elif issubclass(data.dtype.type, np.floating):
216 from .numeric import Float64Index
/Users/Peter/anaconda/lib/python2.7/site-packages/pandas/indexes/numeric.pyc in __new__(cls, data, dtype, copy, name, fastpath, **kwargs)
105 # with a platform int
106 if (dtype is None or
--> 107 not issubclass(np.dtype(dtype).type, np.integer)):
108 dtype = np.int64
109
TypeError: data type "index" not understood
Pandy wersja: 0.18.0-np110py27_0
Aktualizacja
Wszystko działało ... Dzięki wszystkim!
Czy możesz skomentować swój kod, aby ja (i wszyscy) mogliśmy podążać za Tobą całkowicie? Hm wydaje się, że iPython działa bardzo wolno z tym kodem. W rzeczywistości utknął w 'df = df ['all']. Str.extract ('\ t'.join ([' (. *) '] * (N + 1)), expand = True)' wiersz .. . jakieś pomysły? –
Zmieniono kod (więc nie używa już tej linii) i dodano sekcję dotyczącą odczytywania pliku TSV w porcjach. Jeśli porcja nie jest zbyt duża, powinieneś szybciej widzieć wyniki. Co więcej, być może nie musisz tworzyć jednej ogromnej DataFrame; być może możesz przetwarzać TSV w porcjach iteracyjnie. – unutbu
'df = df.set_index ('pole', append = True)' throws 'TypeError: typ danych" index "not understand' ... Możesz wypróbować mój [plik danych (tylko 30MB)] (https: // drive.google.com/open?id=0BxWmwAIo1D_nUUpqTU5TdDlaUHc) ... Właściwie nie mam pojęcia dlaczego. Wydaje się być błędem pandy –