2017-06-12 48 views
0

これは非常に奇妙なエラーです。明らかに理由がないため、パンダDataFrame groupbyを実行するとKeyErrorを取得しました。提案されているようdf.columns = df.columns.map(str.strip)を使用して、KeyError from pandas DataFrame groupby

df = pd.read_csv('test.csv') 
df.tail(5) 

df.info() 
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 165 entries, 0 to 164 
Data columns (total 3 columns): 
Id  165 non-null object 
Time 165 non-null object 
Val  165 non-null float64 
dtypes: float64(1), object(2) 
memory usage: 3.9+ KB 

df.columns 
Index([u'Id', u'Time', u'Val'], dtype='object') 

df.groupby(['Id']) 
KeyErrorTraceback (most recent call last) 
<ipython-input-24-bba5c2dc5f75> in <module>() 
----> 1 df.groupby(['Id']) 

/usr/local/lib/python2.7/dist-packages/pandas/core/generic.pyc in groupby(self, by, axis, level, as_index, sort, group_keys, squeeze, **kwargs) 
    3776   return groupby(self, by=by, axis=axis, level=level, as_index=as_index, 
    3777      sort=sort, group_keys=group_keys, squeeze=squeeze, 
-> 3778      **kwargs) 
... 
/usr/local/lib/python2.7/dist-packages/pandas/core/internals.pyc in get(self, item, fastpath) 
    3288 
    3289    if not isnull(item): 
-> 3290     loc = self.items.get_loc(item) 
    3291    else: 
    3292     indexer = np.arange(len(self.items))[isnull(self.items)] 

/usr/local/lib/python2.7/dist-packages/pandas/indexes/base.pyc in get_loc(self, key, method, tolerance) 
    1945     return self._engine.get_loc(key) 
    1946    except KeyError: 
-> 1947     return self._engine.get_loc(self._maybe_cast_indexer(key)) 
    1948 
    1949   indexer = self.get_indexer([key], method=method, tolerance=tolerance) 

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4154)() 

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:4018)() 

pandas/hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12368)() 

pandas/hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12322)() 

KeyError: 'Id' 

注いずれかが異なることはありません - 私はまだ上記とまったく同じdf.columnsからの出力とエラーになっています:どこにでも存在する場合

df.columns = df.columns.map(str.strip) 
df.columns 
Out[38]: 
Index([u'Id', u'Time', u'Val'], dtype='object') 

をその"test.csv"はWindowsベースで、SQL Server SSMSから出力されます。問題はファイルの形式であることがほぼ確実であるため、この "test.csv"を投稿できます。これは非常に重要です。私がオープンしたときには、&がNotepad ++を使って正確に内容をコピーしていました。新しく保存されたファイルにこのような問題はありません。 Linuxでfile test.csvを使用して

は示しています

0000000 ef bb bf 49 64 2c 54 69 - 6d 65 2c 56 61 6c 0d 0a Id,Time,Val.. 
0000020 54 35 31 31 35 2c 30 30 - 3a 30 30 3a 30 30 2c 32 T5115,00:00:00,2 
0000040 30 2e 38 31 39 0d 0a 54 - 35 31 31 35 2c 30 30 3a 0.819..T5115,00: 
0000060 30 30 3a 30 33 2c 31 36 - 2e 39 32 36 0d 0a 54 35 00:03,16.926..T5 
0000100 31 31 35 2c 30 30 3a 30 - 30 3a 30 38 2c 31 31 2e 115,00:00:08,11. 
0000120 33 34 33 0d 0a 54 35 31 - 31 35 2c 30 30 3a 30 30 343..T5115,00:00 
0000140 3a 31 37 2c 36 2e 39 37 - 35 0d 0a 54 35 31 31 35 :17,6.975..T5115 
0000160 2c 30 30 3a 30 30 3a 32 - 39 2c 31 33 2e 35 35 33 ,00:00:29,13.553 
0000200 0d 0a 54 35 31 31 35 2c - 30 30 3a 30 30 3a 33 35 ..T5115,00:00:35 

それを解決する方法任意のアイデア:ここ

test.csv: UTF-8 Unicode (with BOM) text, with CRLF line terminators 

は、ファイルからトップいくつかのバイトがありますか?どうも。

+0

あなたは 'df.columnsの=のDFを試すことができます。 columns.map(str.strip) ' – piRSquared

+0

@ piRSquared、ありがとうございます。 OPが更新されました。 – xpt

答えて

1

Line terminatorsは、他のオペレーティングシステムとは異なります。ASCIIエンコーディングでは、Unixライクなオペレーティングシステムの改行文字はLF、WindowsではCRLFです。システム間の互換性を維持するために、WindowsにCRLF行が終了し、他のオペレーティングシステムではLFのファイルを保存するには、Git allows the optionを保存してください。これはあなたの問題を引き起こしています - pandas.read_csvがSQL Serverに保存されたファイル上で実行されると、行末はCRLFpandasはすべての行の末尾に余分なCR文字があると解釈します。

は幸いにも、あなたのために、read_csv機能は、あなたの行が正しく読ま持っているパラメータlineterminatoryou can set to "\r"CR文字が含まれています。

+0

残念ながら、 'lineterminator = '\ r''を使用すると、Idは' \ nT5119'として読み込まれるため、私のためには機能しません。私も 'lineterminator = '\ r \ n''を試しましたが、エラーを受け取ります。**' ValueError:長さ1行のターミネータだけがサポートされています '** – xpt

1

実際には、Windowsベースのcsvファイルが根本的な原因です。

証明:

  1. 私が開いたが、&はメモ帳++を使用して、正確にコンテンツを保存し、新たに保存したファイルと、そのような問題はなくなりますコピー。
  2. Linuxでdos2unixを使用して変換した場合、上記のコードを試してみるとうまくいきます。 groupbyはもう例外を投げません。パンダが0.19より前の場合、https://github.com/pandas-dev/pandas/issues/16690

    でバグそして、それに対する解決策を提出

pd.read_csvencoding='utf-8-sig'を使用します。

df = pd.read_csv('test.csv', encoding='utf-8-sig')