Nhập tệp CSV dưới dạng DataFrame gấu trúc


91

Cách Python đọc trong tệp CSV thành DataFrame của gấu trúc là gì (sau đó tôi có thể sử dụng cho các phép toán thống kê, có thể có các cột được đánh kiểu khác, v.v.)?

Tệp CSV của tôi "value.txt"có nội dung sau:

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

Trong R, chúng tôi sẽ đọc tệp này bằng cách sử dụng:

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

và điều đó sẽ trả về một 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

Có cách nào của Pythonic để có được chức năng tương tự không?


bạn sẽ khen ngợi về điều đặc biệt của khung dữ liệu và bạn có thể thực hiện thao tác thống kê nào với nó?
LWZ

3
dataframe có thể chứa nhiều loại dữ liệu, ví dụ: mỗi cột có thể là một danh sách và bạn có thể xử lý từng danh sách riêng lẻ áp dụng một số chức năng trên chúng và nói về các phép toán thống kê, như có giá trị trung bình, độ lệch chuẩn, phần tư,. ..
mazlor

Cảm ơn! Điều này thực sự rất hữu ích đối với tôi. Tôi luôn tải tệp csv bằng mô-đun csv cung cấp cho tôi danh sách các danh sách. Data.frame này nghe hay hơn!
LWZ

@LWZ: xem các chỉnh sửa và liên kết của tôi, lmk nếu điều đó trả lời ngắn gọn câu hỏi của bạn. Đó là những gì chúng tôi có thể làm ở đây để 'bán' gói lợi ích. Câu hỏi rộng hơn "Lợi ích của việc sử dụng khung dữ liệu gấu trúc trên mảng / list-of-list của Python đơn giản là gì?" có nhiều lợi ích, cách quá nhiều vào danh sách ở đây ...
SMCI

Câu trả lời:


160

gấu trúc để giải cứu:

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

Điều này trả về DataFrame của gấu trúc tương tự như R's.


10

Để đọc tệp CSV dưới dạng DataFrame gấu trúc, bạn cần sử dụng pd.read_csv.

Nhưng đây không phải là nơi câu chuyện kết thúc; dữ liệu tồn tại ở nhiều định dạng khác nhau và được lưu trữ theo những cách khác nhau, vì vậy bạn thường sẽ cần chuyển các tham số bổ sung read_csvđể đảm bảo dữ liệu của bạn được đọc đúng cách.

Dưới đây là bảng liệt kê các tình huống phổ biến gặp phải với tệp CSV cùng với đối số thích hợp mà bạn sẽ cần sử dụng. Bạn thường sẽ cần tất cả hoặc một số kết hợp của các đối số bên dưới để đọc trong dữ liệu của mình .

┌──────────────────────────────────────────────────────────┬─────────────────────────────┬────────────────────────────────────────────────────────┐
│  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=',')             │
└──────────────────────────────────────────────────────────┴─────────────────────────────┴────────────────────────────────────────────────────────┘

Chú thích

  1. Theo mặc định, read_csvsử dụng công cụ phân tích cú pháp C cho hiệu suất. Bộ phân tích cú pháp C chỉ có thể xử lý các dấu phân tách ký tự đơn. Nếu CSV của bạn có dấu phân tách nhiều ký tự, bạn sẽ cần sửa đổi mã của mình để sử dụng 'python'công cụ. Bạn cũng có thể chuyển các biểu thức chính quy:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    
  2. UnicodeDecodeErrorxảy ra khi dữ liệu được lưu trữ ở một định dạng mã hóa nhưng được đọc ở một định dạng khác, không tương thích. Hầu hết các lược đồ mã hóa phổ biến là 'utf-8''latin-1', dữ liệu của bạn có thể phù hợp với một trong những lược đồ này.

  3. header=Falsechỉ định rằng hàng đầu tiên trong CSV là hàng dữ liệu thay vì hàng tiêu đề và names=[...]cho phép bạn chỉ định danh sách tên cột để gán cho DataFrame khi nó được tạo.

  4. "Không tên: 0" xảy ra khi một DataFrame có chỉ mục chưa được đặt tên được lưu vào CSV và sau đó được đọc lại. Thay vì phải khắc phục sự cố trong khi đọc, bạn cũng có thể khắc phục sự cố khi viết bằng cách sử dụng

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

Có những đối số khác mà tôi không đề cập ở đây, nhưng đây là những đối số bạn sẽ gặp thường xuyên nhất.


1
Bạn có thể sửa lại / định dạng lại bảng dưới dạng hình ảnh dưới dạng văn bản Unicode bằng cách sử dụng ví dụ ozh.github.io/ascii-tables không? Nếu không, nó sẽ khó đọc và sẽ không được lập chỉ mục cho tìm kiếm nội dung hoặc có thể tìm thấy bằng tìm kiếm văn bản Ctrl-F cũ thuần túy.
smci

@smci Tôi đồng ý với những gì bạn nói về việc lập chỉ mục (cộng với thực tế là người khác không thể chỉnh sửa hình ảnh) nhưng nó trông gần như không đẹp và yêu cầu cuộn nên khó theo dõi.
cs95

dù sao thì bạn cũng cần viết lại nó để thân thiện với người dùng mới; thay vì những thứ khó hiểu như 'Tránh 'Chưa đặt tên: 0'' nó nên nói điều gì đó đồng bằng tiếng Anh như ' index_col: gấu trúc tell mà cột (s) để sử dụng như chỉ mục cho dataframe của bạn'
SMCI

@smci Có vẻ như bảng ASCII không phù hợp với các ký tự trên - nó làm rối loạn định dạng bảng.
cs95

cs95: Tôi đã đề xuất Unicode, không phải ASCII. Unicode hoạt động tốt. Vì vậy, chỉ cần thay đổi mặc định trong kéo xuống trên ozh.github.io/ascii-tables
SMCI

9

Đây là một giải pháp thay thế cho thư viện gấu trúc sử dụng mô-đun csv tích hợp của Python .

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

sẽ in

{'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 = ',')

Thao tác này sẽ nhập tệp .txt hoặc .csv của bạn vào 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

Bạn có thể sử dụng mô-đun csv được tìm thấy trong thư viện tiêu chuẩn python để thao tác với tệp CSV.

thí dụ:

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

-0. Đến từ R, mazlor sẽ không tìm kiếm csvmô-đun vì nó ở mức quá thấp. pandascung cấp mức trừu tượng được yêu cầu.
Steven Rumbalski

... ngoài nó đọc dữ liệu vào một đối tượng hữu ích Python như một mảng NumPy ...
Paul Hiemstra

0

nhập gấu trúc dưới dạng pd
dataset = pd.read_csv ('/ home / nspython / Downloads / movie_metadata1.csv')


-1

Lưu ý là khá sạch sẽ, nhưng:

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

Không nhỏ gọn, nhưng nó thực hiện công việc:

   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
Điều này không trả lời câu hỏi của OP vì nó không đọc dữ liệu csv vào một đối tượng Python.
Paul Hiemstra

có thể thay thế num bằng liệt kê trong vòng lặp for?
LWZ

@PaulHiemstra, OP đã không đề cập đến "đối tượng", nhưng yêu cầu dễ dàng. Tuy nhiên, tôi nghi ngờ cách tiếp cận "gấu trúc" phù hợp hơn với những gì được yêu cầu.
Lee-Man
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.