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


91

CSVファイルをパンダの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")  

そしてそれはRdata.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の方法はありますか?


データフレームの特別な点と、それを使用して実行できる統計操作について賞賛しますか?
LWZ 2013年

3
データフレームには複数のタイプのデータを含めることができます。たとえば、すべての列をリストにすることができ、すべてのリストを個別に処理して、いくつかの関数を適用し、平均、標準偏差、四分位数などの統計演算について話すことができます。 ..
mazlor 2013年

ありがとう!これは実際に私にとって非常に便利です。私はいつも、リストのリストを提供するcsvモジュールを使用してcsvファイルをロードしました。このdata.frameの方がずっといいですね!
LWZ 2013年

@LWZ:私の編集とリンクを参照してください。それがあなたの質問に簡潔に答えるなら、lmk。これは、福利厚生パッケージを「販売」するためにここでできることと同じです。より広い質問「プレーンなPython配列/リストのリストよりもパンダのデータフレームを使用する利点は何ですか?」多くの利点、ここにリストにあまりにも多くの道...持っている
SMCI

回答:


160

救助するパンダ

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

これにより、に類似したpandasDataFrameが返されR'sます。


10

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

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

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

┌──────────────────────────────────────────────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────┐
│  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=FalseCSVの最初の行がヘッダー行ではなくデータ行であるnames=[...]ことを指定し、作成時にDataFrameに割り当てる列名のリストを指定できるようにします。

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

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

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


1
たとえばozh.github.io/ascii-tablesを使用して、table-as-imageをUnicodeテキストとして再貼り付け/再フォーマットしてください。そうしないと、読みにくく、コンテンツ検索用にインデックスが作成されないか、従来のCtrl-Fテキスト検索で見つけることができません。
SMCI

@smciインデックス作成についてあなたが言ったことに同意します(さらに、他の人が画像を編集できないという事実)が、見た目はそれほど良くなく、スクロールが必要で、追跡が困難です。
cs 9519年

とにかく、新しいユーザーにとって使いやすいように書き直す必要があります。代わりのような不可解なものの:「避けてください『0名前』」それはのようなもの平易な英語を言うべきindex_col:TELLパンダ列(複数可)あなたのデータフレームのための指標として使用する」
SMCI

@smci ASCIIテーブルは上付き文字でうまく再生されないように見えます-それは、テーブルのフォーマットを台無しにします。
cs 9519年

cs95:ASCIIではなくUnicodeをお勧めします。Unicodeは正常に機能します。したがって、ozh.github.io / ascii
tablesの

9

これは、Pythonの組み込みcsvモジュールを使用した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
import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')

これにより、.txtまたは.csvファイルがDataFrameにインポートされます。



1
%cd C:\Users\asus\Desktop\python
import pandas as pd
df = pd.read_csv('value.txt')
df.head()
    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

0

Python標準ライブラリにあるcsvモジュールを使用して、CSVファイルを操作できます。

例:

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

-0。Rから来ると、mazlorはcsvモジュールが低すぎるため、モジュールを探しません。 pandas要求されたレベルの抽象化を提供します。
Steven Rumbalski 2013年

...さらに、numpy配列などの便利なPythonオブジェクトにデータを読み込みます...
Paul Hiemstra 2013年

0

パンダをpd
データセットとしてインポート= pd.read_csv( '/ home / nspython / Downloads / movie_metadata1.csv')


-1

かなりきれいに注意してください、しかし:

import csv

with open("value.txt", "r") as f:
    csv_reader = reader(f)
    num = '  '
    for row in csv_reader:
        print num, '\t'.join(row)
        if num == '  ':  
            num=0
        num=num+1

それほどコンパクトではありませんが、それは仕事をします:

   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

1
これは、csvデータをPythonオブジェクトに読み込まないため、OPの質問には答えません。
Paul Hiemstra 2013年

forループでnumをenumerateに置き換えますか?
LWZ 2013年

@ PaulHiemstra、OPは「オブジェクト」について言及していませんが、簡単にお願いします。それでも、「パンダ」のアプローチは、求められていたものにより適していると思います。
リー・マン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.