So. Wir haben eine chaotisch Daten in einer TSV-Datei gespeichert, die ich analysieren muss. Dies ist, wie esPython. Pandas. Große Daten. Unordentliche TSV-Datei. Wie man die Daten streitet?
siehtstatus=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/
Und das Problem ist, dass einige der Reihen unterschiedliche Spaltenreihenfolge haben/einige von ihnen Werte fehlen, und ich muss mit hoher Leistung, dass loszuwerden (da die Datensätze Ich arbeite mit bis zu 100 Gigabyte).
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)
Jetzt habe ich die fehlende Werte zu befreien, aber ein Problem bleibt nach wie vor! Dies ist, wie die Daten aussehen:
Und das ist, wie das Problem aussieht:
Wie Sie einige Spalten zu sehen sind, ausgeglichen werden. Ich habe eine sehr niedrige Leistungslösung
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)
So, jetzt die Daten sehen gut aus ... zumindest ich kann mit ihm arbeiten! Aber was ist die High-Performance ALTERNATIVE zu der Methode, die ich oben gemacht habe?
-Update auf unutbu Code: Zurückverfolgungsfehler
---------------------------------------------------------------------------
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
Pandas Version: 0.18.0-np110py27_0
aktualisieren
Alles funktionierte ... Vielen Dank allen!
Könnten Sie bitte Ihren Code kommentieren, damit ich (und jeder) Ihnen vollständig folgen kann? Hm es scheint, dass iPython mit diesem Code wirklich langsam arbeitet. Tatsächlich ist es bei 'df = df ['all'] hängen geblieben. Str.extract ('\ t'.join ([' (. *) '] * (N + 1)), expand = True)' Zeile .. . irgendwelche Ideen? –
Ich habe den Code geändert (so dass er diese Zeile nicht mehr verwendet) und einen Abschnitt hinzugefügt, wie man eine TSV-Datei in Chunks liest. Wenn die Chunksize nicht zu groß ist, sollten Sie in der Lage sein, Ergebnisse schneller zu sehen. Außerdem müssen Sie möglicherweise keinen riesigen Datenrahmen bilden. vielleicht können Sie den TSV iterativ in Blöcken verarbeiten. – unutbu
'df = df.set_index ('Feld', append = True)' throws 'TypeError: Datentyp" index "nicht verstanden' ... Sie können meine [Datendatei (nur 30Mb)] ausprobieren (https: // drive.google.com/open?id=0BxWmwAIo1D_nUUpqTU5TdDlaUHc) ... Eigentlich habe ich keine Ahnung warum. Scheint ein Pandas Bug zu sein –