CSV dosyasını bir Pandas DataFrame olarak içe aktarın


91

Bir CSV dosyasında pandalar DataFrame'e okumanın Python yolu nedir (daha sonra istatistiksel işlemler için kullanabilirim, farklı türde sütunlar olabilir, vb.)?

CSV dosyam "value.txt"aşağıdaki içeriğe sahip:

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'de bu dosyayı kullanarak okurduk:

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

ve bu bir R data.frame döndürür:

> 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

Aynı işlevselliği elde etmenin bir Pythonic yolu var mı?


dataframe ile neyin özel olduğunu ve onunla hangi istatistiksel işlemi yapabileceğinizi övecek misiniz?
LWZ

3
dataframe, birden fazla veri türü içerebilir, örneğin her sütun bir liste olabilir ve her listeyi tek tek bunlara bazı işlevleri uygulayarak ve ortalama, standart sapma, çeyreklik gibi istatistiksel işlemlerden bahsedebilirsiniz. ..
mazlor

Teşekkürler! Bu aslında benim için çok faydalı. Her zaman csv dosyasını bana bir liste listesi veren csv modülüyle yükledim. Bu data.frame kulağa çok daha iyi geliyor!
LWZ

@LWZ: düzenlemelerime ve bağlantıya bakın, eğer sorularınızı kısa ve öz bir şekilde yanıtlarsa lmk. Bu, yardım paketini 'satmak' için burada yapabileceğimiz kadar. Daha geniş soru "Pandalar veri çerçevesi kullanmanın düz Python dizisi / liste listesi yerine faydaları nelerdir?" birçok faydası var, burada listelenemeyecek kadar çok ...
smci

Yanıtlar:


160

pandalar kurtarmaya:

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

Bu , benzer pandalar DataFrame'i döndürür R's.


11

Bir CSV dosyasını pandalar DataFrame olarak okumak için kullanmanız gerekir pd.read_csv.

Ama hikayenin bittiği yer burası değil; veriler birçok farklı biçimde bulunur ve farklı şekillerde depolanır, bu nedenle read_csvverilerinizin doğru bir şekilde okunmasını sağlamak için genellikle ek parametreler iletmeniz gerekir.

Kullanmanız gereken uygun bağımsız değişkenle birlikte CSV dosyalarıyla karşılaşılan yaygın senaryoları listeleyen bir tablo aşağıda verilmiştir. Okumak için aşağıdaki Genellikle tartışmaların tamamının veya bir kısmının kombinasyonu gerekir sizin veri.

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

Dipnotlar

  1. Varsayılan olarak, read_csvperformans için bir C ayrıştırıcı motoru kullanır. C ayrıştırıcısı yalnızca tek karakterli ayırıcıları işleyebilir. CSV'nizin çok karakterli bir ayırıcısı varsa, 'python'motoru kullanmak için kodunuzu değiştirmeniz gerekecektir . Ayrıca normal ifadeleri de iletebilirsiniz:

    df = pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
    
  2. UnicodeDecodeErrorveriler tek bir kodlama biçiminde depolandığında ancak farklı, uyumsuz bir biçimde okunduğunda oluşur. En yaygın kodlama şemaları, 'utf-8've 'latin-1'verilerinizin bunlardan birine sığması muhtemeldir.

  3. header=Falsenames=[...]CSV'deki ilk satırın bir başlık satırı yerine bir veri satırı olduğunu belirtir ve bu, oluşturulduğunda DataFrame'e atanacak bir sütun adları listesi belirtmenize olanak tanır.

  4. Adsız dizine sahip bir DataFrame CSV'ye kaydedildiğinde ve daha sonra yeniden okunduğunda "Adsız: 0" oluşur. Okurken sorunu çözmek zorunda kalmadan, yazarken de sorunu çözebilirsiniz.

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

Burada bahsetmediğim başka argümanlar da var, ancak bunlar en sık karşılaşacağınız argümanlar.


1
Örneğin ozh.github.io/ascii-tables kullanarak tabloyu Unicode metin olarak yeniden yapıştırabilir / yeniden biçimlendirebilir misiniz ? Aksi takdirde okunması zordur ve içerik araması için dizine eklenmez veya düz eski Ctrl-F metin aramasıyla bulunamaz.
smci

@smci İndeksleme hakkında söylediklerinize katılıyorum (artı görüntülerin başkaları tarafından düzenlenemeyeceği gerçeği), ancak bu kadar iyi görünmüyor ve takip edilmesini zorlaştıran kaydırma gerektiriyor.
cs95

yine de yeni bir kullanıcı için kullanıcı dostu olması için yeniden yazmanız gerekir; yerine gibi anlaşılmaz şeyler : 'kaçının '0 Adsız'' o gibi bir şey düz İngilizce demeliyim ' index_col: söyle pandalar kolon (lar) dataframe için endeks olarak kullanılır'
SMCI

@smci Görünüşe göre ASCII tabloları üst simgelerle iyi oynamıyor - tablo biçimlendirmesini bozuyor.
cs95

cs95: ASCII'yi değil, Unicode'u önerdim. Unicode iyi çalışıyor. Dolayısıyla, sadece üzerinde aşağı çekme içinde varsayılan değiştirmek ozh.github.io/ascii-tables
SMCI

9

İşte Python'un yerleşik csv modülünü kullanan pandalar kitaplığına bir alternatif .

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

yazdıracak

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

Bu, .txt veya .csv dosyanızı bir DataFrame'e aktarır.



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

Sen kullanabilirsiniz csv modülü CSV dosyalarını işlemek için piton standart kütüphanede buldum.

misal:

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

-0. R'den geliyor, mazlor csvmodülü çok düşük seviyede olduğu için aramıyor . pandasistenen soyutlama seviyesini sağlar.
Steven Rumbalski

... ek olarak, verileri uyuşmuş bir dizi gibi yararlı bir Python nesnesine okur ...
Paul Hiemstra

0

pandaları pd
dataset = pd.read_csv ('/ home / nspython / Downloads / movie_metadata1.csv') olarak içe aktar


-1

Oldukça temiz not edin, ancak:

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

O kadar kompakt değil, ama işi yapıyor:

   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
Bu, csv verilerini bir Python nesnesine okumadığı için OP'nin sorusuna cevap vermez.
Paul Hiemstra

belki for döngüsünde num'u numaralandırmakla değiştirebilir misiniz?
LWZ

@PaulHiemstra, OP "nesne" den bahsetmedi, kolaylık istedi. Yine de, "pandalar" yaklaşımının istenen şeye daha çok uyduğundan şüpheleniyorum.
Lee-Man
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.