Importuj plik CSV jako pandas DataFrame

91

W jaki sposób Python odczytuje plik CSV do pandy DataFrame (której mogę następnie użyć do operacji statystycznych, może mieć kolumny z innym typem itp.)?

Mój plik CSV "value.txt"ma następującą zawartość:

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

W R czytalibyśmy ten plik używając:

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

a to zwróci 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

Czy istnieje sposób w Pythonie na uzyskanie tej samej funkcjonalności?

mazlor
źródło
pochwalisz, co jest specjalnego w dataframe i jaką operację statystyczną możesz z nim zrobić?
LWZ
3
Dataframe może zawierać więcej niż jeden typ danych, na przykład każda kolumna może być listą, a każdą listę można traktować indywidualnie, stosując na nich pewne funkcje i mówiąc o operacjach statystycznych, takich jak wyznaczanie średniej, odchylenie standardowe, kwartyl,. ..
mazlor
Dzięki! To jest dla mnie bardzo przydatne. Zawsze ładowałem plik csv z modułem csv, który daje mi listę list. Ta data.frame brzmi o wiele lepiej!
LWZ
@LWZ: zobacz moje zmiany i link, jeśli to zwięźle odpowiada na twoje pytania. To tyle, ile możemy tutaj zrobić, aby „sprzedać” pakiet świadczeń. Szersze pytanie: „Jakie są zalety używania ramki danych pandy w porównaniu ze zwykłą tablicą / listą Pythona?” ma wiele zalet, zbyt wiele, aby je tutaj wymienić ...
smci

Odpowiedzi:

160

pandy na ratunek:

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

Zwraca pandas DataFrame, który jest podobny do R's.

korzeń
źródło
10

Aby odczytać plik CSV jako pandas DataFrame, musisz użyć pd.read_csv.

Ale to nie jest koniec historii; dane istnieją w wielu różnych formatach i są przechowywane na różne sposoby, więc często trzeba będzie przekazać dodatkowe parametry, read_csvaby zapewnić poprawny odczyt danych.

Oto tabela zawierająca typowe scenariusze napotkane w przypadku plików CSV wraz z odpowiednim argumentem, którego będziesz musiał użyć. Zazwyczaj trzeba wszystkich lub niektórych kombinacji argumentów poniżej, aby przeczytać w swojej danych.

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

Przypisy

  1. Domyślnie read_csvużywa silnika parsera C do wydajności. Parser języka C obsługuje tylko separatory pojedynczych znaków. Jeśli Twój plik CSV ma separator wieloznakowy, musisz zmodyfikować kod, aby korzystać z 'python'silnika. Możesz również przekazywać wyrażenia regularne:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    
  2. UnicodeDecodeErrorwystępuje, gdy dane były przechowywane w jednym formacie kodowania, ale odczytane w innym, niekompatybilnym formacie. Najpopularniejsze schematy kodowania to 'utf-8'i 'latin-1', Twoje dane prawdopodobnie będą pasować do jednego z nich.

  3. header=Falseokreśla, że ​​pierwszy wiersz w pliku CSV jest wierszem danych, a nie wierszem nagłówka, a names=[...]umożliwia określenie listy nazw kolumn do przypisania do elementu DataFrame podczas jego tworzenia.

  4. „Bez nazwy: 0” występuje, gdy DataFrame z nienazwanym indeksem jest zapisywana w pliku CSV, a następnie ponownie odczytywana. Zamiast naprawiać problem podczas czytania, możesz również rozwiązać problem podczas pisania przy użyciu

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

Są inne argumenty, o których tutaj nie wspomniałem, ale to są te, z którymi będziesz się najczęściej spotykać.

cs95
źródło
1
Czy możesz ponownie wkleić / sformatować tabelę jako obraz jako tekst Unicode, używając np. Ozh.github.io/ascii-tables ? W przeciwnym razie jest trudny do odczytania i nie będzie indeksowany w celu wyszukiwania treści ani znaleziony za pomocą zwykłego starego wyszukiwania tekstowego Ctrl-F.
smci
@smci Zgadzam się z tym, co powiedziałeś o indeksowaniu (plus fakt, że obrazy nie mogą być edytowane przez inne osoby), ale nie wygląda to tak dobrze i wymaga przewijania, co utrudnia śledzenie.
cs95
w każdym razie musisz go przepisać, aby był przyjazny dla nowego użytkownika; zamiast niezrozumiałych rzeczy, takich jak „Unikaj„ Bez nazwy: 0 ”” , powinno być napisane coś prostego po angielsku, np. index_col: powiedz pandom, które kolumny mają być używane jako indeksy dla twojej ramki danych”
smci
@smci Wygląda na to, że tabele ASCII nie działają dobrze z indeksami górnymi - psuje formatowanie tabeli.
cs95
cs95: Zalecałem Unicode, nie ASCII. Unicode działa dobrze. Po prostu zmień wartość domyślną w menu rozwijanym na ozh.github.io/ascii-tables
smci
9

Oto alternatywa dla biblioteki pandas przy użyciu wbudowanego modułu csv w języku 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

wydrukuje

{'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']}
sidi
źródło
6
import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')

Spowoduje to zaimportowanie pliku .txt lub .csv do DataFrame.

Rishabh
źródło
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
chahat
źródło
0

Możesz użyć modułu csv znajdującego się w standardowej bibliotece Pythona do manipulowania plikami CSV.

przykład:

import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
KurzedMetal
źródło
-0. Pochodząc z R, mazlor nie szukałby csvmodułu, ponieważ jest za niski. pandaszapewnia żądany poziom abstrakcji.
Steven Rumbalski
... dodatkowo czyta dane do użytecznego obiektu Pythona, takiego jak tablica numpy ...
Paul Hiemstra,
0

importuj pandy jako pd
dataset = pd.read_csv ('/ home / nspython / Downloads / movie_metadata1.csv')

ns_piumal
źródło
-1

Uwaga równie czysta, ale:

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

Nie tak kompaktowy, ale spełnia swoje zadanie:

   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
Lee-Man
źródło
1
To nie odpowiada na pytanie OP, ponieważ nie odczytuje danych csv do obiektu Pythona.
Paul Hiemstra,
może zamienić num na enumerate w pętli for?
LWZ
@PaulHiemstra, OP nie wspomniał o „obiekcie”, ale poprosił o ułatwienie. Mimo to podejrzewam, że podejście „pandy” lepiej pasuje do tego, o co proszono.
Lee-Man