นำเข้าไฟล์ CSV เป็น DataFrame แพนด้า


98

วิธี Python ในการอ่านไฟล์ CSV ในDataFrame ของแพนด้าคืออะไร (ซึ่งฉันสามารถใช้สำหรับการดำเนินการทางสถิติสามารถมีคอลัมน์ที่พิมพ์ต่างกันได้ ฯลฯ )

ไฟล์ 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 ธรรมดา / list-of-list คืออะไร? มีประโยชน์มากมายมีรายการมากมายที่นี่ ...
smci

คำตอบ:


166

แพนด้าเพื่อช่วยเหลือ:

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

ผลตอบแทนนี้นุ่นDataFrameR'sที่คล้ายกับ


12

หากต้องการอ่านไฟล์ 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เกิดขึ้นเมื่อข้อมูลถูกจัดเก็บในรูปแบบการเข้ารหัสเดียว แต่อ่านในรูปแบบอื่นที่ไม่เข้ากัน รูปแบบการเข้ารหัสที่พบบ่อยที่สุดคือ'utf-8'และ'latin-1'ข้อมูลของคุณมีแนวโน้มที่จะเข้ากับหนึ่งในนั้น

  3. header=Falseระบุว่าแถวแรกใน CSV เป็นแถวข้อมูลแทนที่จะเป็นแถวส่วนหัวและnames=[...]อนุญาตให้คุณระบุรายการชื่อคอลัมน์เพื่อกำหนดให้กับ DataFrame เมื่อสร้างขึ้น

  4. "ไม่มีชื่อ: 0" เกิดขึ้นเมื่อ DataFrame ที่มีดัชนีที่ไม่มีชื่อถูกบันทึกเป็น CSV แล้วอ่านซ้ำ แทนที่จะต้องแก้ไขปัญหาในขณะที่อ่านคุณยังสามารถแก้ไขปัญหาเมื่อเขียนโดยใช้

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

มีข้อโต้แย้งอื่น ๆ ที่ฉันไม่ได้พูดถึงที่นี่ แต่เป็นข้อโต้แย้งที่คุณจะพบบ่อยที่สุด


1
คุณช่วยวาง / ฟอร์แมตตารางเป็นรูปภาพใหม่เป็นข้อความ Unicode โดยใช้เช่นozh.github.io/ascii-tables ได้ไหม มิฉะนั้นจะอ่านยากและจะไม่ถูกจัดทำดัชนีสำหรับการค้นหาเนื้อหาหรือค้นหาได้ด้วยการค้นหาข้อความ Ctrl-F แบบเก่า
smci

@smci ฉันเห็นด้วยกับสิ่งที่คุณพูดเกี่ยวกับการจัดทำดัชนี (บวกกับความจริงที่ว่าคนอื่นไม่สามารถแก้ไขรูปภาพได้) แต่มันดูไม่ดีเท่าไหร่และต้องใช้การเลื่อนซึ่งทำให้ยากต่อการติดตาม
cs95

อย่างไรก็ตามคุณต้องเขียนใหม่เพื่อให้ใช้งานง่ายสำหรับผู้ใช้ใหม่ แทนที่จะเป็นสิ่งที่เข้าใจยากเช่น"หลีกเลี่ยง" ไม่มีชื่อ: 0 ""ควรพูดภาษาอังกฤษธรรมดา ๆ เช่น" index_colบอกแพนด้าว่าควรใช้คอลัมน์ใดเป็นดัชนีสำหรับกรอบข้อมูลของคุณ"
smci

@smci ดูเหมือนว่าตาราง ASCII จะไม่เล่นกับตัวยกได้ดี - มันทำให้การจัดรูปแบบตารางยุ่งเหยิง
cs95

cs95: ฉันแนะนำ Unicode ไม่ใช่ ASCII Unicode ทำงานได้ดี ดังนั้นเพียงแค่เปลี่ยนค่าเริ่มต้นในแบบดึงลงบนozh.github.io/ascii-tables
smci

10

นี่เป็นทางเลือกให้กับห้องสมุดหมีแพนด้าใช้งูใหญ่ในตัวของโมดูล CSV

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


2

ลองทำตามนี้

import pandas as pd
data=pd.read_csv('C:/Users/Downloads/winequality-red.csv')

แทนที่ตำแหน่งเป้าหมายของไฟล์ด้วยตำแหน่งที่พบชุดข้อมูลของคุณอ้างอิง url นี้ https://medium.com/@kanchanardj/jargon-in-python-used-in-data-science-to-laymans-language-part- หนึ่ง -12ddfd31592f


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

คุณสามารถใช้โมดูล csv ที่พบในไลบรารีมาตรฐาน python เพื่อจัดการไฟล์ 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

... นอกจากนี้ยังอ่านข้อมูลในวัตถุ Python ที่มีประโยชน์เช่นอาร์เรย์ numpy ...
Paul Hiemstra


-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
สิ่งนี้ไม่ตอบคำถามของ OP เนื่องจากไม่ได้อ่านข้อมูล csv ลงในวัตถุ Python
Paul Hiemstra

อาจแทนที่ตัวเลขด้วยการแจงนับใน for loop?
LWZ

@PaulHiemstra, OP ไม่ได้กล่าวถึง "วัตถุ" แต่ขอความสะดวก ถึงกระนั้นฉันก็สงสัยว่าวิธีการของ "แพนด้า" เหมาะกับสิ่งที่ถูกขอมากกว่า
Lee-Man
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.