Імпортуйте файл CSV як файл pandas DataFrame


91

Який спосіб Python читати у файлі CSV у pandas 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

Чи існує пітонічний спосіб отримати ту саму функціональність?


Ви похвалите те, чим особливим є фрейм даних, і яку статистичну операцію ви можете з ним зробити?
LWZ

3
dataframe is може містити більше одного типу даних, наприклад, кожен стовпець може бути списком, і ви можете обробляти кожен список, застосовуючи окремі функції до них окремо, і говорячи про статистичні операції, такі як середнє значення, стандартне відхилення, квартиль,. ..
mazlor

Дякую! Це насправді дуже корисно для мене. Я завжди завантажую файл csv за допомогою модуля csv, який дає мені список списків. Цей data.frame звучить набагато краще!
LWZ

@LWZ: перегляньте мої правки та посилання, lmk, якщо це лаконічно відповідає на ваші запитання. Це стільки, скільки ми можемо зробити тут, щоб «продати» пакет пільг. Більш широке запитання "Які переваги використання кадру даних pandas над простим масивом 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

Це повертає pandas DataFrame , подібний до R's.


11

Щоб прочитати файл 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=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. Юнікод чудово працює. Тож просто змініть значення за замовчуванням у спадному меню ozh.github.io/ascii-tables
smci

9

Ось альтернатива бібліотеці панд за допомогою вбудованого модуля csv в 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

надрукує

{'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

Ви можете використовувати модуль 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забезпечує необхідний рівень абстракції.
Стівен Румбальський,

... крім того, він зчитує дані в корисний об'єкт Python, такий як масив numpy ...
Paul 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
Це не відповідає на запитання OP, оскільки не зчитує дані csv у об’єкт Python.
Paul Hiemstra,

може замінити num на enumerate у циклі for?
LWZ

@PaulHiemstra, OP не згадав "об'єкт", але попросив полегшити. Тим не менше, я підозрюю, що підхід "панди" більше відповідає тому, про що просили.
Lee-Man
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.