web-dev-qa-db-ja.com

CSVファイルをpandas DataFrameとしてインポートします

CSVファイルを pandas DataFrame に読み込むPythonの方法は何ですか(これを統計操作に使用したり、異なるタイプの列を使用したりできます)。

CSVファイル"value.txt"のコンテンツは次のとおりです。

Date,"price","factor_1","factor_2"
2012-06-11,1600.20,1.255,1.548
2012-06-12,1610.02,1.258,1.554
2012-06-13,1618.07,1.249,1.552
2012-06-14,1624.40,1.253,1.556
2012-06-15,1626.15,1.258,1.552
2012-06-16,1626.15,1.263,1.558
2012-06-17,1626.15,1.264,1.572

Rでは、以下を使用してこのファイルを読み取ります。

price <- read.csv("value.txt")  

そして、それはR data.frameを返します:

> price <- read.csv("value.txt")
> price
     Date   price factor_1 factor_2
1  2012-06-11 1600.20    1.255    1.548
2  2012-06-12 1610.02    1.258    1.554
3  2012-06-13 1618.07    1.249    1.552
4  2012-06-14 1624.40    1.253    1.556
5  2012-06-15 1626.15    1.258    1.552
6  2012-06-16 1626.15    1.263    1.558
7  2012-06-17 1626.15    1.264    1.572

同じ機能を得るためのPythonの方法はありますか?

68
mazlor

pandas 救助に:

import pandas as pd
print pd.read_csv('value.txt')

        Date    price  factor_1  factor_2
0  2012-06-11  1600.20     1.255     1.548
1  2012-06-12  1610.02     1.258     1.554
2  2012-06-13  1618.07     1.249     1.552
3  2012-06-14  1624.40     1.253     1.556
4  2012-06-15  1626.15     1.258     1.552
5  2012-06-16  1626.15     1.263     1.558
6  2012-06-17  1626.15     1.264     1.572

これはpandas DataFrame を返します。これはR'sに似ています。

121
root

Pythonの組み込みの csv module を使用したpandasライブラリの代替を次に示します。

import csv
from pprint import pprint
with open('foo.csv', 'rb') as f:
    reader = csv.reader(f)
    headers = reader.next()
    column = {h:[] for h in headers}
    for row in reader:
        for h, v in Zip(headers, row):
            column[h].append(v)
    pprint(column)    # Pretty printer

印刷します

{'Date': ['2012-06-11',
          '2012-06-12',
          '2012-06-13',
          '2012-06-14',
          '2012-06-15',
          '2012-06-16',
          '2012-06-17'],
 'factor_1': ['1.255', '1.258', '1.249', '1.253', '1.258', '1.263', '1.264'],
 'factor_2': ['1.548', '1.554', '1.552', '1.556', '1.552', '1.558', '1.572'],
 'price': ['1600.20',
           '1610.02',
           '1618.07',
           '1624.40',
           '1626.15',
           '1626.15',
           '1626.15']}
6
sidi

CSVファイルをpandas DataFrameとして読み取るには、 pd.read_csv を使用する必要があります。

しかし、これは物語の終わりではありません。データはさまざまな形式で存在し、さまざまな方法で保存されるため、多くの場合、read_csvに追加のパラメーターを渡して、データを適切に読み込む必要があります。

CSVファイルで発生する一般的なシナリオと、使用する必要のある適切な引数をリストした表を次に示します。通常、yourデータを読み込むには、以下の引数のすべてまたはいくつかの組み合わせが必要です。

┌──────────────────────────────────────────────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────┐
│  ScenarioArgumentExample                                               │
├──────────────────────────────────────────────────────────┼─────────────────────────────┼────────────────────────────────────────────────────────┤
│  Read CSV with different separator¹                      │  sep/delimiter              │  read_csv(..., sep=';')                                │
│  Read CSV with tab/whitespace separator                  │  delim_whitespace           │  read_csv(..., delim_whitespace=True)                  │
│  Fix UnicodeDecodeError while reading²                   │  encoding                   │  read_csv(..., encoding='latin-1')                     │
│  Read CSV without headers³                               │  header and names           │  read_csv(..., header=False, names=['x', 'y', 'z'])    │
│  Specify which column to set as the index⁴               │  index_col                  │  read_csv(..., index_col=[0])                          │
│  Read subset of columns                                  │  usecols                    │  read_csv(..., usecols=['x', 'y'])                     │
│  Numeric data is in European format (eg., 1.234,56)      │  thousands and decimal      │  read_csv(..., thousands='.', decimal=',')             │
└──────────────────────────────────────────────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────┘

脚注

  1. デフォルトでは、read_csvはCパーサーエンジンを使用してパフォーマンスを向上させます。 Cパーサーは、単一文字の区切り文字のみを処理できます。 CSVに複数文字の区切り文字がある場合、'python'エンジンを使用するようにコードを変更する必要があります。正規表現を渡すこともできます:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    
  2. UnicodeDecodeErrorは、データが1つのエンコード形式で保存されていたが、別の互換性のない形式で読み取られた場合に発生します。最も一般的なエンコードスキームは'utf-8''latin-1'であり、データはこれらのいずれかに適合する可能性があります。

  3. header=Falseは、CSVの最初の行がヘッダー行ではなくデータ行であることを指定し、names=[...]を使用すると、作成時にDataFrameに割り当てる列名のリストを指定できます。

  4. 「名前なし:0」は、名前のないインデックスを持つDataFrameがCSVに保存され、その後再読み取りされるときに発生します。読み取り中に問題を修正する代わりに、書き込み時に問題を修正することもできます

    df.to_csv(..., index=False)
    

ここで言及しなかった他の議論もありますが、これらは最も頻繁に遭遇するものです。

4
cs95

python標準ライブラリにある csv module を使用して、CSVファイルを操作できます。

例:

import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
0
KurzedMetal