59ミリの行を持つ超大規模のcsv.gzipファイルがあります。特定の条件に基づいて特定の行のファイルをフィルタリングし、そのすべての行を新しいマスターcsvファイルに入れたいとします。現在、gzipファイルを118個の小さなcsvファイルに分割し、それらをコンピュータに保存しました。私は次のコードでそれを行いました:Python:大きなファイルを分割し、条件に基づいてフィルタを適用し、すべてのデータを新しいCSVファイルに入れます。
import pandas as pd
num = 0
df = pd.read_csv('google-us-data.csv.gz', header = None,
compression = 'gzip', chunksize = 500000,
names = ['a','b','c','d','e','f','g','h','i','j','k','l','m'],
error_bad_lines = False, warn_bad_lines = False)
for chunk in df:
num = num + 1
chunk.to_csv('%ggoogle us'%num ,sep='\t', encoding='utf-8'
上記のコードは完全に働きました。私は118個の小さなファイルを含むフォルダを持っています。私はその後、特定の条件に合った行を抽出し、それらをすべて私が作成し、「google final us」という名前の新しいCSVファイルに追加するように、118個のファイルを1つずつ順番に調べるコードを書きました。ここでは、コードは次のとおりです。
import pandas as pd
import numpy
for i in range (1,118)
file = open('google final us.csv','a')
df = pd.read_csv('%ggoogle us'%i, error_bad_lines = False,
warn_bad_lines = False)
df_f = df.loc[(df['a']==7) & (df['b'] == 2016) & (df['c'] =='D') &
df['d'] =='US')]
file.write(df_f)
残念ながら、上記のコードは私に、以下のエラーを与えている:
KeyError Traceback (most recent call last)
C:\Users\...\Anaconda3\lib\site-packages\pandas\indexes\base.py in
get_loc(self, key, method, tolerance)
1875 try:
-> 1876 return self._engine.get_loc(key)
1877 except KeyError:
pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4027)()
pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:3891)()
pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item
(pandas\hashtable.c:12408)()
pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item
(pandas\hashtable.c:12359)()
KeyError: 'a'
During handling of the above exception, another exception occurred:
KeyError Traceback (most recent call last)
<ipython-input-9-0ace0da2fbc7> in <module>()
3 file = open('google final us.csv','a')
4 df = pd.read_csv('1google us')
----> 5 df_f = df.loc[(df['a']==7) & (df['b'] == 2016) &
(df['c'] =='D') & (df['d'] =='US')]
6 file.write(df_f)
C:\Users\...\Anaconda3\lib\site-packages\pandas\core\frame.py in
__getitem__(self, key)
1990 return self._getitem_multilevel(key)
1991 else:
-> 1992 return self._getitem_column(key)
1993
1994 def _getitem_column(self, key):
C:\Users\...\Anaconda3\lib\site-packages\pandas\core\frame.py in
_getitem_column(self, key)
1997 # get column
1998 if self.columns.is_unique:
-> 1999 return self._get_item_cache(key)
2000
2001 # duplicate columns & possible reduce dimensionality
C:\Users\...\Anaconda3\lib\site-packages\pandas\core\generic.py in
_get_item_cache(self, item)
1343 res = cache.get(item)
1344 if res is None:
-> 1345 values = self._data.get(item)
1346 res = self._box_item_values(item, values)
1347 cache[item] = res
C:\Users\...\Anaconda3\lib\site-packages\pandas\core\internals.py in
get(self, item, fastpath)
3223
3224 if not isnull(item):
-> 3225 loc = self.items.get_loc(item)
3226 else:
3227 indexer = np.arange(len(self.items))
[isnull(self.items)]
C:\Users\...\Anaconda3\lib\site-packages\pandas\indexes\base.py in
get_loc(self, key, method, tolerance)
1876 return self._engine.get_loc(key)
1877 except KeyError:
-> 1878 return
self._engine.get_loc(self._maybe_cast_indexer(key))
1879
1880 indexer = self.get_indexer([key], method=method,
tolerance=tolerance)
pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:4027)()
pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:3891)()
pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item
(pandas\hashtable.c:12408)()
pandas\hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item
(pandas\hashtable.c:12359)()
KeyError: 'a'
任意のアイデア間違って何が起こっているのか?私は多くの他のstackoverflow投稿(例:Create dataframes from unique value pairs by filtering across multiple columnsまたはHow can I break down a large csv file into small files based on common records by python)を読んだが、まだこれを行う方法がわからない。また、この方法よりもデータを抽出する方法があれば教えてください - 私に教えてください!
なぜあなたはpandas 'ではなく 'file.write'を使っていますか?[to_csv ](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html)? – Parfait