Panda DataFrame'i CSV dosyasına yazma


717

Pandalar bir CSV dosyasına yazmak istiyorum bir veri çerçevesi var. Bunu kullanarak yapıyorum:

df.to_csv('out.csv')

Ve hatayı alıyorum:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)

Bunu kolayca aşmanın herhangi bir yolu var mı (yani veri çerçevemde unicode karakterler var)? Ve örneğin bir 'sekme' yöntemi (var olduğunu düşünmüyorum) kullanarak CSV yerine sekmeyle ayrılmış bir dosyaya yazmak için bir yolu var mı?

Yanıtlar:


1048

Bir sekme ile sınırlamak için şu separgümanı kullanabilirsiniz to_csv:

df.to_csv(file_name, sep='\t')

Belirli bir kodlama kullanmak için (örn. 'Utf-8') encodingargümanı kullanın :

df.to_csv(file_name, sep='\t', encoding='utf-8')

32
index=FalseDizini bırakmak için eklemek istiyorum .
Medhat

12
Başlangıçta 7 yıl önce yazmış olduğum soruya nasıl bir cevap bulduğum konusunda kafam karıştı.
Hayden

251

Bir depolama zaman DataFramebir nesneyi CSV dosyası kullanılarak to_csvyöntemi, muhtemelen alışkanlık depolamak için ihtiyaç olduğu önceki indeksleri her satırda bir DataFramenesne.

Sen edebilirsiniz kaçınmak bir ileterek o Falsekadar boole değeri indexparametresi.

Biraz gibi:

df.to_csv(file_name, encoding='utf-8', index=False)

DataFrame nesneniz şuna benzerse:

  Color  Number
0   red     22
1  blue     10

Csv dosyası şunları depolar:

Color,Number
red,22
blue,10

yerine ( varsayılan değerin True geçildiği durumda)

,Color,Number
0,red,22
1,blue,10

Dizin oluşturma isteniyorsa, ancak bir başlığı da olması gerekiyorsa ne olur? Sadece kullanıyor df.rename_axis('index_name')musun? dosyayı değiştirmez
Zap

21

Bir CSV dosyasına panda DataFrame yazmak için ihtiyacınız olacak DataFrame.to_csv. Bu işlev, belirli kullanım durumunuza uyacak şekilde daha fazla geçersiz kılmanız gerekmeyeceğinden makul varsayılanlara sahip birçok argüman sunar. Örneğin, farklı bir ayırıcı kullanmak, datetime biçimini değiştirmek veya yazarken dizini bırakmak isteyebilirsiniz. to_csvbu gereksinimleri ele almak için iletebileceğiniz argümanlar var.

Aşağıda, CSV dosyalarına yazmanın bazı yaygın senaryolarını ve bunlar için kullanabileceğiniz ilgili bağımsız değişkenleri listeleyen bir tablo bulunmaktadır.

CSV ma dude'ye yaz

Dipnotlar

  1. Varsayılan ayırıcının virgül ( ',') olduğu varsayılır . İhtiyacınız olduğunu bilmedikçe bunu değiştirmeyin.
  2. Varsayılan olarak, dizini dfilk sütun olarak yazılır. DataFrame'inizin bir dizini yoksa (IOW, df.indexvarsayılan değerdir RangeIndex), index=Falseyazarken ayarlamak istersiniz . Bunu farklı bir şekilde açıklamak için, verilerinizde bir dizin varsa, ( index=Truevarsayılan olarak olduğu gibi ) kullanabilirsiniz veya tamamen dışarıda bırakabilirsiniz True.
  3. Diğer verilerin verilerinizi nasıl okuyacağını bilmesi için dize verileri yazıyorsanız bu parametreyi ayarlamak akıllıca olacaktır. Bu aynı zamanda UnicodeEncodeErrortasarruf ederken karşılaşabileceğiniz potansiyelleri de önler .
  4. Diske büyük DataFrames (> 100K satır) yazıyorsanız, daha küçük çıktı dosyalarına neden olacağı için sıkıştırma önerilir. OTOH, yazma süresinin artacağı anlamına gelir (ve sonuç olarak, dosyanın sıkıştırılmasının açılması gerektiğinden okuma süresi).

18

Eğer 'utf-8' kodlama sorunları yaşıyorsanız ve hücre hücre gitmek istiyorsanız deneyebilirsiniz başka bir şey aşağıdakileri deneyebilirsiniz.

Python 2

(Burada "df" DataFrame nesnenizdir.)

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = unicode(x.encode('utf-8','ignore'),errors ='ignore') if type(x) == unicode else unicode(str(x),errors='ignore')
            df.set_value(idx,column,x)
        except Exception:
            print 'encoding error: {0} {1}'.format(idx,column)
            df.set_value(idx,column,'')
            continue

O zaman dene:

df.to_csv(file_name)

Sütunların kodlamasını aşağıdakilerle kontrol edebilirsiniz:

for column in df.columns:
    print '{0} {1}'.format(str(type(df[column][0])),str(column))

Uyarı: hatalar = 'yoksay' karakteri yalnızca atlar;

IN: unicode('Regenexx\xae',errors='ignore')
OUT: u'Regenexx'

Python 3

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = x if type(x) == str else str(x).encode('utf-8','ignore').decode('utf-8','ignore')
            df.set_value(idx,column,x)
        except Exception:
            print('encoding error: {0} {1}'.format(idx,column))
            df.set_value(idx,column,'')
            continue

11

Bazen UTF-8 kodlamasını da belirtirseniz bu sorunlarla karşılaşırsınız. Dosyayı okurken kodlamayı ve dosyaya yazarken aynı kodlamayı belirtmenizi öneririm. Bu, sorununuzu çözebilir.


7

Windows'ta tam yol içeren dosyada dışa aktarma örneği ve dosyanızın üstbilgileri olması durumunda :

df.to_csv (r'C:\Users\John\Desktop\export_dataframe.csv', index = None, header=True) 

Komut dosyanızın bulunduğu dizinde, utf-8 kodlaması ve ayırıcı olarak sekmeyle klasörde depolamak istiyorsanız, örnek :

df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header='true')

7

bu durumun cevabı olmayabilir, ama aynı hata mesajını .to_csvdenedim .toCSV('name.csv')ve hata mesajı farklıydı (" SparseDataFrame' object has no attribute 'toCSV').

df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')

İkinci hatada kullandığınız gibi görünüyor .toCSVve değil .to_csv.
Kyle C
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.