Importieren Sie eine CSV-Datei als Pandas-DataFrame

85

Was ist die Python-Methode zum Einlesen einer CSV-Datei in einen Pandas-DataFrame (den ich dann für statistische Operationen verwenden kann, der Spalten mit unterschiedlichen Typen usw. haben kann)?

Meine CSV-Datei "value.txt"enthält folgenden Inhalt:

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

In R würden wir diese Datei lesen mit:

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

und das würde einen R data.frame zurückgeben:

> 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

Gibt es eine pythonische Möglichkeit, die gleiche Funktionalität zu erhalten?

Mazlor
quelle
Werden Sie empfehlen, was das Besondere an Dataframe ist und welche statistische Operation Sie damit durchführen können?
LWZ
3
Der Datenrahmen kann mehr als einen Datentyp enthalten, z. B. kann jede Spalte eine Liste sein, und Sie können jede Liste einzeln behandeln, indem Sie einige Funktionen auf sie anwenden und über statistische Operationen wie Mittelwert, Standardabweichung, Quartil ,. ..
Mazlor
Vielen Dank! Das ist eigentlich sehr nützlich für mich. Ich habe immer eine CSV-Datei mit dem CSV-Modul geladen, das mir eine Liste von Listen gibt. Dieser data.frame klingt viel besser!
LWZ
@LWZ: siehe meine Änderungen und Link, lmk, wenn das deine Fragen kurz beantwortet. Das ist so viel, wie wir hier tun können, um das Leistungspaket zu "verkaufen". Die umfassendere Frage "Was sind die Vorteile der Verwendung eines Pandas-Datenrahmens gegenüber einem einfachen Python-Array / einer Liste von Listen?" hat viele Vorteile, viel zu viele, um sie hier
aufzulisten

Antworten:

154

Pandas zur Rettung:

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

Dies gibt Pandas DataFrame zurück , die ähnlich sind R's.

Wurzel
quelle
9

Hier ist eine Alternative zur Pandas-Bibliothek mit dem in Python integrierten CSV-Modul .

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

wird gedruckt

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

Um eine CSV-Datei als Pandas DataFrame zu lesen, müssen Sie verwenden pd.read_csv.

Aber hier endet die Geschichte nicht. Daten sind in vielen verschiedenen Formaten vorhanden und werden auf unterschiedliche Weise gespeichert. Daher müssen Sie häufig zusätzliche Parameter übergeben, read_csvum sicherzustellen, dass Ihre Daten ordnungsgemäß eingelesen werden.

In der folgenden Tabelle sind gängige Szenarien für CSV-Dateien sowie das entsprechende Argument aufgeführt, das Sie verwenden müssen. Normalerweise benötigen Sie alle oder eine Kombination der folgenden Argumente, um Ihre Daten einzulesen .

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

Fußnoten

  1. read_csvVerwendet standardmäßig eine C-Parser-Engine für die Leistung. Der C-Parser kann nur Einzelzeichen-Trennzeichen verarbeiten. Wenn Ihre CSV über ein mehrstelliges Trennzeichen verfügt, müssen Sie Ihren Code ändern, um die 'python'Engine verwenden zu können. Sie können auch reguläre Ausdrücke übergeben:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
  2. UnicodeDecodeErrortritt auf, wenn die Daten in einem Codierungsformat gespeichert, aber in einem anderen, inkompatiblen Format gelesen wurden. Die gängigsten Codierungsschemata sind 'utf-8'und 'latin-1', Ihre Daten passen wahrscheinlich in eines davon.

  3. header=FalseGibt an, dass die erste Zeile in der CSV eher eine names=[...]Datenzeile als eine Kopfzeile ist, und ermöglicht es Ihnen, eine Liste von Spaltennamen anzugeben, die dem DataFrame beim Erstellen zugewiesen werden sollen.

  4. "Unbenannt: 0" tritt auf, wenn ein DataFrame mit einem nicht benannten Index in CSV gespeichert und anschließend erneut gelesen wird. Anstatt das Problem beim Lesen beheben zu müssen, können Sie das Problem auch beim Schreiben mithilfe von beheben

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

Es gibt andere Argumente, die ich hier nicht erwähnt habe, aber diese werden Ihnen am häufigsten begegnen.

cs95
quelle
1
Können Sie die Tabelle als Bild bitte als Unicode-Text neu einfügen / formatieren, indem Sie z. B. ozh.github.io/ascii-tables verwenden ? Andernfalls ist es schwer zu lesen und wird nicht für die Inhaltssuche indiziert oder mit der einfachen alten Strg-F-Textsuche gefunden.
smci
@smci Ich stimme zu, was Sie über die Indizierung gesagt haben (plus die Tatsache, dass Bilder nicht von anderen Personen bearbeitet werden können), aber es sieht bei weitem nicht so gut aus und erfordert einen Bildlauf, der es schwierig macht, dem zu folgen.
CS95
Auf jeden Fall müssen Sie es neu schreiben, um für einen neuen Benutzer benutzerfreundlich zu sein. Anstelle von unverständlichen Dingen wie 'Vermeiden Sie "Unbenannt: 0"' sollte etwas einfaches Englisch wie ' index_col: Sagen Sie den Pandas, welche Spalte (n) als Index für Ihren Datenrahmen verwendet werden sollen'
smci
@smci Es sieht so aus, als würden ASCII-Tabellen nicht gut mit hochgestellten Zeichen spielen - es bringt die Tabellenformatierung durcheinander.
CS95
cs95: Ich habe Unicode empfohlen, nicht ASCII. Unicode funktioniert gut. Ändern Sie einfach die Standardeinstellung im Pulldown auf ozh.github.io/ascii-tables
smci
6
import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')

Dadurch wird Ihre TXT- oder CSV-Datei in einen DataFrame importiert.

Rishabh
quelle
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
Kamal
quelle
0

Sie können das CSV- Modul in der Python-Standardbibliothek verwenden, um CSV-Dateien zu bearbeiten.

Beispiel:

import csv
with open('some.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
KurzedMetal
quelle
-0. Mazlor kommt aus R und würde nicht nach dem csvModul suchen, da es zu niedrig ist. pandasbietet die angeforderte Abstraktionsebene.
Steven Rumbalski
... außerdem liest es die Daten in ein nützliches Python-Objekt wie ein Numpy-Array ...
Paul Hiemstra
-1

Beachten Sie ganz so sauber, aber:

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

Nicht so kompakt, aber es macht den Job:

   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
quelle
1
Dies beantwortet die Frage des OP nicht, da die CSV-Daten nicht in ein Python-Objekt eingelesen werden.
Paul Hiemstra
Vielleicht ersetzen Sie die Zahl durch Aufzählung in der for-Schleife?
LWZ
@PaulHiemstra, OP erwähnte nicht "Objekt", sondern bat um Leichtigkeit. Trotzdem vermute ich, dass der "Pandas" -Ansatz besser zu dem passt, wonach gefragt wurde.
Lee-Man