2013-02-22 22 views
45

usecolsでカラムをフィルタリングして複数のインデックスを使用すると、正しく入力されないCSVファイルがpandas.read_csvにあります。
pandas read_csvとusecolsでカラムをフィルタリングする

import pandas as pd 
csv = r"""dummy,date,loc,x 
bar,20090101,a,1 
bar,20090102,a,3 
bar,20090103,a,5 
bar,20090101,b,1 
bar,20090102,b,3 
bar,20090103,b,5""" 
f = open('foo.csv', 'w') 
f.write(csv) 
f.close() 

df1 = pd.read_csv('foo.csv', 
     index_col=["date", "loc"], 
     usecols=["dummy", "date", "loc", "x"], 
     parse_dates=["date"], 
     header=0, 
     names=["dummy", "date", "loc", "x"]) 
print df1 

# Ignore the dummy columns 
df2 = pd.read_csv('foo.csv', 
     index_col=["date", "loc"], 
     usecols=["date", "loc", "x"], # <----------- Changed 
     parse_dates=["date"], 
     header=0, 
     names=["dummy", "date", "loc", "x"]) 
print df2 

私はDF1とDF2が不足しているダミー列を除いて同じであることを期待しますが、列は誤ったラベルに来ます。また、日付は日付として解析されています。

In [118]: %run test.py 
       dummy x 
date  loc 
2009-01-01 a  bar 1 
2009-01-02 a  bar 3 
2009-01-03 a  bar 5 
2009-01-01 b  bar 1 
2009-01-02 b  bar 3 
2009-01-03 b  bar 5 
       date 
date loc 
a 1 20090101 
    3 20090102 
    5 20090103 
b 1 20090101 
    3 20090102 
    5 20090103 

名前の代わりに列番号を使用すると、同じ問題が発生します。私はread_csvステップの後にダミーカラムを削除することで問題を回避することができますが、何がうまくいかないのか理解しようとしています。私はパンダ0.10.1を使用しています。

編集:固定ヘッダーの使用が修正されました。このコードは、あなたが望むものを達成し

+1

何か他のもの、 'header'と' names'キーワードの使用状況が正しくありません(理由ですあなたの例では、最初の行が欠けています。ヘッダーには、ヘッダーを持つ行としてint(デフォルトは0)が必要です。 'True'を1と解釈するため、2行目ヘッダーがありません。ただし、列名は正しいそれを 'names'引数で上書きします。しかし、それらを残すこともできますし、最初の行はデフォルトで列名に使用されます。しかし、それはあなたの最初の質問を解決しません。 – joris

+1

これは 'usecols'バグのようです。おそらく[bug 2654](https://github.com/pydata/pandas/issues/2654)に関連していますか? – abudis

+0

バグはまだ名前とヘッダー引数なしで見つけられました。 –

答えて

7

CSVファイルに余分なデータが含まれている場合は、列はインポート後にデータフレームからdeletedすることができます。私たちを与える

import pandas as pd 
from StringIO import StringIO 

csv = r"""dummy,date,loc,x 
bar,20090101,a,1 
bar,20090102,a,3 
bar,20090103,a,5 
bar,20090101,b,1 
bar,20090102,b,3 
bar,20090103,b,5""" 

df = pd.read_csv(StringIO(csv), 
     index_col=["date", "loc"], 
     usecols=["dummy", "date", "loc", "x"], 
     parse_dates=["date"], 
     header=0, 
     names=["dummy", "date", "loc", "x"]) 
del df['dummy'] 

は:

   x 
date  loc 
2009-01-01 a 1 
2009-01-02 a 3 
2009-01-03 a 5 
2009-01-01 b 1 
2009-01-02 b 3 
2009-01-03 b 5 
10

---も、その奇妙な、確かにバギー:

a)は、あなたがindex_col RELを指定:

が、私はそれがときに動作することを観察しました。あなたが本当に使用する列の数に ​​- 同じ本例ではそれほどの3つの列ではなく、4(あなたがdummyをドロップしてから以降からカウント開始)

B)usecolsためそうparse_dates

C)ではないため;)明白な理由

日間)ここで私は、この動作

を印刷し

import pandas as pd 
from StringIO import StringIO 

csv = """dummy,date,loc,x 
bar,20090101,a,1 
bar,20090102,a,3 
bar,20090103,a,5 
bar,20090101,b,1 
bar,20090102,b,3 
bar,20090103,b,5 
""" 

df = pd.read_csv(StringIO(csv), 
     index_col=[0,1], 
     usecols=[1,2,3], 
     parse_dates=[0], 
     header=0, 
     names=["date", "loc", "", "x"]) 

print df 

をミラーリングするnamesを適応

   x 
date  loc 
2009-01-01 a 1 
2009-01-02 a 3 
2009-01-03 a 5 
2009-01-01 b 1 
2009-01-02 b 3 
2009-01-03 b 5 
最初
+1

ありがとうございます。 ''名前 ''と '' usecols''に基づいた数字を正しく並べ替えるという正しい組み合わせが、データが正しいようになったことは決してありませんでした。 – chip

-3

輸入csvファイルと処理するために、その簡単にcsv.DictReader使用...

+0

これはより簡単かもしれませんが、大変遅くなります。大規模なデータセット(私は現在、自分で13 GBのCSVファイルを1つ扱っています)で作業しているときに、ファイルが読み込まれるまで何時間も待つ必要はありません。 –

41

@chipによって答えは完全に2つのキーワード引数のポイントを逃します。

  • そこにはヘッダがありません、あなたが列名ではなく、整数インデックスを使用して他の引数を指定する場合にのみ必要です。
  • usecolsは、DataFrame全体をメモリに読み込む前にフィルタを提供することになっています。正しく使用すると、読んだ後に列を削除する必要はありません。

このソリューションは、これらの奇妙を修正:

たちを与える
import pandas as pd 
from StringIO import StringIO 

csv = r"""dummy,date,loc,x 
bar,20090101,a,1 
bar,20090102,a,3 
bar,20090103,a,5 
bar,20090101,b,1 
bar,20090102,b,3 
bar,20090103,b,5""" 

df = pd.read_csv(StringIO(csv), 
     header=0, 
     index_col=["date", "loc"], 
     usecols=["date", "loc", "x"], 
     parse_dates=["date"]) 

   x 
date  loc 
2009-01-01 a 1 
2009-01-02 a 3 
2009-01-03 a 5 
2009-01-01 b 1 
2009-01-02 b 3 
2009-01-03 b 5 
+0

これはCSVデータを解析するためのテキストブックソリューションですが、実際のデータにはヘッダーがないため、* name *引数の使用を検討していました。 – chip

+0

この場合、 'header = 0'は指定しません。 'header = None'を使い、さらに' names'を使いたいでしょう。 – Mack

関連する問題