CSV 파일을 Pandas DataFrame으로 가져 오기


95

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

동일한 기능을 얻는 Pythonic 방법이 있습니까?


데이터 프레임의 특별한 점과이를 통해 어떤 통계 연산을 수행 할 수 있는지 칭찬 하시겠습니까?
LWZ

3
데이터 프레임은 둘 이상의 데이터 유형을 포함 할 수 있습니다. 예를 들어 모든 열은 목록이 될 수 있으며 모든 목록을 개별적으로 처리 할 수 ​​있으며 일부 기능을 적용하고 평균, 표준 편차, 사 분위수 등 통계 연산에 대해 이야기 할 수 있습니다. ..
mazlor

감사! 이것은 실제로 나에게 매우 유용합니다. 나는 항상 목록 목록을 제공하는 csv 모듈을 사용하여 csv 파일을로드했습니다. 이 data.frame은 훨씬 더 잘 들립니다!
LWZ

@LWZ : 내 편집 및 링크를 참조하십시오. 질문에 대한 답이 간결하다면 lmk입니다. 혜택 패키지를 '판매'하기 위해 여기서 할 수있는만큼입니다. 더 넓은 질문 "평범한 Python 배열 / 목록 목록보다 pandas 데이터 프레임을 사용하는 이점은 무엇입니까?" 여기에 나열하기에는 너무 많은 혜택이 있습니다 ...
smci

답변:


163

구출에 판다 :

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

.NET 과 유사한 pandas DataFrame 을 반환 합니다 R's.


12

CSV 파일을 pandas 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데이터가 하나의 인코딩 형식으로 저장되었지만 호환되지 않는 다른 형식으로 읽 혔을 때 발생합니다. 가장 일반적인 인코딩 체계는 'utf-8'및이며 'latin-1', 데이터는이 중 하나에 적합합니다.

  3. header=FalseCSV의 첫 번째 행이 헤더 행이 아니라 데이터 행 names=[...]임을 지정하고을 사용하면 생성 될 때 DataFrame에 할당 할 열 이름 목록을 지정할 수 있습니다.

  4. "Unnamed : 0"은 이름이 지정되지 않은 인덱스가있는 DataFrame이 CSV에 저장되고 나중에 다시 읽을 때 발생합니다. 읽는 동안 문제를 해결하는 대신 다음을 사용하여 글을 쓸 때 문제를 해결할 수도 있습니다.

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

여기에서 언급하지 않은 다른 주장이 있지만 가장 자주 접하게 될 주장입니다.


1
예를 들어 ozh.github.io/ascii-tables를 사용하여 이미지로 테이블을 유니 코드 텍스트로 다시 복사 / 재 형식화 할 수 있습니까 ? 그렇지 않으면 읽기 어렵고 콘텐츠 검색을 위해 인덱싱되지 않거나 일반 이전 Ctrl-F 텍스트 검색으로 찾을 수 없습니다.
smci

@smci 나는 당신이 인덱싱에 대해 말한 것에 동의하지만 (다른 사람이 이미지를 편집 할 수 없다는 사실을 포함) 거의 좋아 보이지 않고 스크롤이 필요하므로 따라 가기가 어렵습니다.
cs95

어쨌든 새로운 사용자에게 사용자 친화적이되도록 다시 작성해야합니다. 'Avoid "Unnamed : 0"' 과 같은 이해할 수없는 내용 대신 ' index_col: 데이터 프레임의 인덱스로 사용할 열을 pandas에게 알려
smci

@smci ASCII 테이블은 위 첨자와 잘 어울리지 않는 것 같습니다. 테이블 형식을 엉망으로 만듭니다.
cs95

cs95 : ASCII가 아닌 유니 코드를 권장했습니다. 유니 코드는 잘 작동합니다. 따라서 ozh.github.io/ascii-tables
smci

10

다음은 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

...뿐만 아니라 그것은 ... 그런 NumPy와 배열로 유용한 파이썬 객체에 데이터를 읽어 않습니다
폴 Hiemstra

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

for 루프에서 num을 enumerate로 바꿀 수 있습니까?
LWZ

@PaulHiemstra, OP는 "객체"를 언급하지 않았지만 용이함을 요청했습니다. 그래도 "판다"접근 방식이 요청 된 것에 더 잘 맞는다고 생각합니다.
Lee-Man
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.