67

「PythonforDataAnalysis」の本を読んでいて、「例:2012連邦選挙委員会データベース」セクションでデータをDataFrameに読み取るのに問題があります。問題は、index_col引数がNoneに設定されている場合でも、データの列の1つが常にインデックス列として設定されていることです。

データへのリンクは次のとおりです:http://www.fec.gov/disclosurep/PDownload.do

ロードコードは次のとおりです(チェックの時間を節約するために、nrows = 10を設定しました):

import pandas as pd
fec = pd.read_csv('P00000001-ALL.csv',nrows=10,index_col=None)

短くするために、データ列の出力を除外していますが、ここに私の出力があります(インデックス値ではありません)。

In [20]: fec

Out[20]:
<class 'pandas.core.frame.DataFrame'>
Index: 10 entries, C00410118 to C00410118
Data columns:
...
dtypes: float64(4), int64(3), object(11)

そして、これが本の出力です(ここでもデータ列は除外されています):

In [13]: fec = read_csv('P00000001-ALL.csv')
In [14]: fec
Out[14]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1001731 entries, 0 to 1001730
...
dtypes: float64(1), int64(1), object(14)

出力のインデックス値は、実際にはファイル内のデータの最初の列であり、残りのすべてのデータが1つずつ左に移動します。このデータ列がインデックスとしてリストされないようにする方法を知っている人はいますか?インデックスを+1増加する整数にしたいのですが。

私はPythonとパンダにかなり慣れていないので、ご不便をおかけして申し訳ありません。ありがとう。

4

3 に答える 3

102

素早い回答

各行の終わりに区切り文字がある場合index_col=Falseの代わりに使用して、インデックス列の推論を無効にし、最後の列を破棄します。index_col=None

もっと詳しく

データを見ると、各行の終わりにカンマがあります。そして、この引用 (ドキュメントは、この投稿が作成された時点から編集されています):

index_col: 結果の DataFrame のインデックス (行ラベル) として使用する列番号、列名、または列番号/名前のリスト。デフォルトでは、ヘッダーよりもデータ列が 1 つ多い場合を除き、列を使用せずに行に番号を付けます。この場合、最初の列がインデックスとして使用されます。

ドキュメントから、 pandas は n 個のヘッダーと n+1 個のデータ列があると信じており、最初の列をインデックスとして扱っていることがわかります。


EDIT 10/20/2014 - 詳細情報

特にトレーリング リミッターとそれらを単に無視する方法に関する別の貴重なエントリを見つけました。

ファイルに列名の数よりも 1 列多いデータがある場合、最初の列が DataFrame の行名として使用されます: ...

通常、この動作は index_col オプションを使用して実現できます。

ファイルが各データ行の末尾に区切り記号を付けて準備されている場合、いくつかの例外的なケースがあり、パーサーを混乱させます。インデックス列の推論を明示的に無効にして最後の列を破棄するには、index_col=False を渡します。

于 2012-10-18T18:19:30.690 に答える