pandalar read_csv ve usecols ile sütunları filtreleme


98

pandas.read_csvSütunları filtrelediğimde usecolsve birden çok dizin kullandığımda doğru şekilde gelmeyen bir csv dosyam var.

import pandas as pd
csv = r"""dummy,date,loc,x
   bar,20090101,a,1
   bar,20090102,a,3
   bar,20090103,a,5
   bar,20090101,b,1
   bar,20090102,b,3
   bar,20090103,b,5"""

f = open('foo.csv', 'w')
f.write(csv)
f.close()

df1 = pd.read_csv('foo.csv',
        header=0,
        names=["dummy", "date", "loc", "x"], 
        index_col=["date", "loc"], 
        usecols=["dummy", "date", "loc", "x"],
        parse_dates=["date"])
print df1

# Ignore the dummy columns
df2 = pd.read_csv('foo.csv', 
        index_col=["date", "loc"], 
        usecols=["date", "loc", "x"], # <----------- Changed
        parse_dates=["date"],
        header=0,
        names=["dummy", "date", "loc", "x"])
print df2

Eksik sahte sütun dışında df1 ve df2'nin aynı olmasını bekliyorum, ancak sütunlar yanlış etiketlenmiş olarak geliyor. Ayrıca tarih, tarih olarak ayrıştırılıyor.

In [118]: %run test.py
               dummy  x
date       loc
2009-01-01 a     bar  1
2009-01-02 a     bar  3
2009-01-03 a     bar  5
2009-01-01 b     bar  1
2009-01-02 b     bar  3
2009-01-03 b     bar  5
              date
date loc
a    1    20090101
     3    20090102
     5    20090103
b    1    20090101
     3    20090102
     5    20090103

İsimler yerine sütun numaraları kullanmak da bana aynı sorunu veriyor. Read_csv adımından sonra kukla sütunu bırakarak sorunu çözebilirim, ancak neyin yanlış gittiğini anlamaya çalışıyorum. Pandalar 0.10.1 kullanıyorum.

düzenleme: hatalı başlık kullanımı düzeltildi.


1
Başka bir şey, headerve namesanahtar kelimelerini kullanımınız doğru değil (bu nedenle örneğinizde ilk satır eksik. headerÜstbilginin olduğu satır olarak bir int (varsayılan 0) bekliyor. Çünkü 1 olarak yorumlanan 'True' veriyorsunuz, ikinci satır (ilk veri satırı) başlık olarak kullanılır ve eksiktir.Ancak, namesbağımsız değişkenle üzerine yazdığınız için sütun adları doğrudur.Ancak ikisini de bırakabilirsiniz ve ilk satır varsayılan olarak sütun adları için kullanılır. Ancak, ilk sorunuzu çözmüyor.
joris

1
Bu bir usecolshataya benziyor . Muhtemelen hata 2654 ile ilgili ?
abudis

hata isimler ve başlık argümanları olmadan hala orada, iyi bul
Andy Hayden

@andy Biraz daha dürteceğim ve pandaların böceklerine göndereceğim. Akıl kontrolünü takdir ediyorum.
chip

Yanıtlar:


116

@Chip'in cevabı, iki anahtar kelime argümanının amacını tamamen kaçırıyor.

  • adlar yalnızca başlık olmadığında ve tamsayı indeksleri yerine sütun adlarını kullanarak diğer argümanları belirtmek istediğinizde gereklidir.
  • usecols'un tüm DataFrame'i belleğe okumadan önce bir filtre sağlaması beklenir; düzgün kullanılırsa, okuduktan sonra sütunların silinmesine asla gerek olmamalıdır.

Bu çözüm şu tuhaflıkları düzeltir:

import pandas as pd
from StringIO import StringIO

csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""

df = pd.read_csv(StringIO(csv),
        header=0,
        index_col=["date", "loc"], 
        usecols=["date", "loc", "x"],
        parse_dates=["date"])

Bu bize şunu verir:

                x
date       loc
2009-01-01 a    1
2009-01-02 a    3
2009-01-03 a    5
2009-01-01 b    1
2009-01-02 b    3
2009-01-03 b    5

1
Bu, CSV verilerini ayrıştırmak için ders kitabı çözümüdür, ancak o zamanlar adlar bağımsız değişkenini kullanmak istiyordum çünkü gerçek verilerin başlığı yoktu.
çip

2
Bu durumda, belirtmezsiniz header=0. Ek olarak kullanmak header=Noneve sonra kullanmak istersiniz names.
Mack

Ama yine de usecolsbirinin @Mack'i saklamak istediği sütunlar için tamsayı dizinleri ile kullan?
Mr_and_Mrs_D

22

Bu kod istediğiniz şeyi başarır - ayrıca tuhaf ve kesinlikle hatalı:

Şu durumlarda işe yaradığını gözlemledim:

a) index_colrel belirtirsiniz . gerçekten kullandığınız sütunların sayısına - yani bu örnekteki üç sütun, dört değil (düşer dummyve o andan itibaren saymaya başlarsınız)

b) aynı parse_dates

c) öyle değil usecols;) bariz nedenlerle

d) burada namesbu davranışı yansıtmak için uyarladım

import pandas as pd
from StringIO import StringIO

csv = """dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5
"""

df = pd.read_csv(StringIO(csv),
        index_col=[0,1],
        usecols=[1,2,3], 
        parse_dates=[0],
        header=0,
        names=["date", "loc", "", "x"])

print df

hangi baskılar

                x
date       loc   
2009-01-01 a    1
2009-01-02 a    3
2009-01-03 a    5
2009-01-01 b    1
2009-01-02 b    3
2009-01-03 b    5

1
Teşekkürler. Verilerin doğru gelmesi için namesve sayılarını yeniden düzenlemenin doğru kombinasyonunu asla bulamadım usecols.
çip

8

Csv dosyanız fazladan veri içeriyorsa, içe aktarmanın ardından sütunlar DataFrame'den silinebilir .

import pandas as pd
from StringIO import StringIO

csv = r"""dummy,date,loc,x
bar,20090101,a,1
bar,20090102,a,3
bar,20090103,a,5
bar,20090101,b,1
bar,20090102,b,3
bar,20090103,b,5"""

df = pd.read_csv(StringIO(csv),
        index_col=["date", "loc"], 
        usecols=["dummy", "date", "loc", "x"],
        parse_dates=["date"],
        header=0,
        names=["dummy", "date", "loc", "x"])
del df['dummy']

Bu bize şunu verir:

                x
date       loc
2009-01-01 a    1
2009-01-02 a    3
2009-01-03 a    5
2009-01-01 b    1
2009-01-02 b    3
2009-01-03 b    5

Neden index_col benim durumumda sorun yaratıyor, önerdiğiniz gibi sütun adını kullanmaya çalıştım, ancak sütun numarasını geçersem işe yaradı.
YouAreAwesome

5
ancak bu bir kaynak israfıdır
Mr_and_Mrs_D

1

Sadece index_col=Falseparametreyi eklemelisiniz

df1 = pd.read_csv('foo.csv',
     header=0,
     index_col=False,
     names=["dummy", "date", "loc", "x"], 
     index_col=["date", "loc"], 
     usecols=["dummy", "date", "loc", "x"],
     parse_dates=["date"])
  print df1

-4

önce csv'yi içe aktarın ve csv.DictReader'ı kullanın, işlenmesi kolaydır ...


2
Bu daha kolay olabilir ama aynı zamanda çok daha yavaştır. Büyük veri kümeleri üzerinde çalışırken (şu anda tek bir 13 GB CSV dosyasıyla çalışıyorum), dosyanın yüklenmesi için saatlerce beklemek zorunda kalmamak çok daha önemli hale geliyor.
Fake Name
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.