2016-09-29 2 views
1

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)を読んだが、まだこれを行う方法がわからない。また、この方法よりもデータを抽出する方法があれば教えてください - 私に教えてください!

+0

なぜあなたはpandas 'ではなく 'file.write'を使っていますか?[to_csv ](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html)? – Parfait

答えて

0
import pandas 
import glob 
csvFiles = glob.glob(path + "/split files/*.csv") 
list_ = [] 
for files in csvFiles: 
    df = pandas.read_csv(files, index_col=None) 
    df_f = df[(df['a']==7) & (df['b'] == 2016) & (df['c'] =='D') & df['d']=='US')] 
    list_.append(df_f) 
frame = pandas.concat(list_, ignore_index=True) 
frame.to_csv("Filtered Appended File") 

csvファイルを読み込むディレクトリに

を必要なすべてのファイルを読み込むことで...これは動作するはずです...作業ディレクトリに

を分割ファイルフォルダ内のすべてのファイルを保持し、メモリをたくさん取ります...それで彼らを壊して、それらに取り組むことは可能な解決策です...あなたは正しいことをしているようです...

+0

すばらしく仕事をしました - ありがとう!また、これを見て他の人のために - この投稿は本当に便利です。http://stackoverflow.com/questions/20906474/import-multiple-csv-files-into-pandas-and-concatenate-into-one-dataframe/36416258#36416258 – SizzyNini

0

file.write(df_f)を使用すると、人間が見るためのDataFrameの文字列表現を効果的に保存しています。デフォルトでは、その表示は行と列を切り捨てて、大きなフレームを画面に合理的な方法で表示できるようにします。その結果、列「a」が切れてしまうことがあります。

私は上記のスニペットをテストしませんでしたが、今すぐに行く方法を知っておく必要があります。

あなたが修正したい場合があり、このコードであり、他の問題、:

  1. ファイルを開き、ループの前に書き込みした後、それを閉じます。コンテキストマネージャを使用するのがベストです。

  2. データ全体がメモリに収まるのであれば、なぜ118個のファイルに分割するのが難しいのですか? df.to_csv()メソッドを使用してフィルタリングし、結果のDataFrameを保存するだけです。

  3. パンダの代わりに、csv.DictReaderを使用して、その行をオンザフライでフィルタすることを検討してください。

最後に、これを1回限りのジョブとすると、grepコマンド(Unixライクなシステムの場合)で達成できるコードを書くのはなぜですか?

+0

オリジナルのgzipファイルをメモリに読み込めません。大きすぎてPythonがクラッシュします。他のヒントをありがとう - 私は彼らにショットを与えるでしょう。私はUNIXベースのシステムを持っていないし、あまりにも多くの経験を持っていない - 私は別の解決策を見つけることができない場合は確かにそれを探検します。 – SizzyNini

関連する問題