2013-06-04 39 views
294

Tôi có một khung dữ liệu trong gấu trúc mà tôi muốn ghi vào tệp CSV. Tôi đang làm việc sử dụng này:Pandas viết dataframe vào tệp CSV

df.to_csv('out.csv') 

Và nhận được lỗi:

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

Có cách nào để làm được việc này một cách dễ dàng (ví dụ: Tôi có ký tự unicode trong khung dữ liệu của tôi)? Và có cách nào để ghi vào một tệp được phân cách bằng tab thay vì sử dụng CSV hay không, ví dụ: một 'to-tab' phương pháp (mà tôi không nghĩ rằng tồn tại)?

Trả lời

469

Để phân định bởi một tab mà bạn có thể sử dụng sep đối số của to_csv:

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

Để sử dụng mã hóa cụ thể (ví dụ như 'utf-8') sử dụng encoding luận:

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

'encoding = 'utf-8'' – Private

+1

Bạn cũng có thể sử dụng 'df.toCSV (file_name, tháng chín =' \ t')', vv – Blairg23

+2

@ Blairg23 Tôi nghĩ đây là tên cũ của chức năng này và đã giảm giá, trên thực tế - điều này không còn có sẵn trong phiên bản mới hơn của gấu trúc! (Tôi không chắc chắn khi nào nó đã được gỡ bỏ ... lạ lùng có vẻ như to_csv đã được sử dụng ở mức 0,4! Http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#id45 Lưu ý: chúng tôi bây giờ là trên 0.14.1) –

5

Đôi khi bạn phải đối mặt với những vấn đề này nếu bạn chỉ định mã hóa UTF-8. Tôi khuyên bạn nên chỉ định mã hóa trong khi đọc tệp và mã hóa giống nhau khi ghi vào tệp. Điều này có thể giải quyết vấn đề của bạn.

8

Một số thứ khác bạn có thể thử nếu bạn gặp sự cố khi mã hóa thành 'utf-8' và muốn di chuyển ô theo ô, bạn có thể thử cách sau.

Python 2

(ở đâu "df" là đối tượng DataFrame của bạn.)

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 

Sau đó thử:

df.to_csv(file_name) 

Bạn có thể kiểm tra mã hóa của các cột theo:

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

Cảnh báo: errors = 'ignore' sẽ bỏ qua ký tự, ví dụ:

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 
0
df.to_csv('out.csv', sep=',') 

Nó sẽ làm việc dứt khoát.

Thay đổi df thành tên của tên khung dữ liệu của bạn và chạy.

Sử dụng anaconda nhàn rỗi.

+11

Chào mừng bạn đến với StackOverflow! Trong khi câu trả lời luôn được đánh giá cao, câu hỏi này đã được hỏi 3 năm trước, và đã có một giải pháp được chấp nhận. Hãy cố gắng tránh các câu hỏi 'va chạm' lên đầu bằng cách cung cấp câu trả lời cho họ, trừ khi câu hỏi chưa được đánh dấu là đã giải quyết hoặc bạn đã tìm thấy giải pháp mới và cải tiến cho vấn đề. Xem tài liệu trên [viết câu trả lời tuyệt vời] (http://stackoverflow.com/help/how-to-answer) để biết một số mẹo về cách làm cho câu trả lời của bạn được tính :) –

43

Tôi muốn thêm một cái gì đó những gì Andy Hayden đã được đề cập trong chính xác câu trả lời của mình.

Khi bạn đang lưu trữ một đối tượng DataFrame vào một tập tin csv sử dụng phương pháp to_csv, có lẽ bạn sẽ không được cần để lưu trữ các chỉ số trước của mỗi hàng của đối tượng DataFrame.

Bạn có thể tránh bằng cách chuyển giá trị boolean False vào tham số index.

Hơi như:

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

Vì vậy, nếu đối tượng DataFrame của bạn là một cái gì đó như:

Color Number 
0 red  22 
1 blue  10 

Các tập tin csv sẽ lưu trữ:

Color,Number 
red,22 
blue,10 

thay vì (trường hợp khi giá trị mặc địnhTrue đã được chuyển)

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

Tìm thấy nó đáng để chia sẻ, Chúc mừng! :-)

0

nó có thể không phải là câu trả lời cho trường hợp này, nhưng như tôi đã có cùng một lỗi tin nhắn với .to_csv tôi đã cố gắng .toCSV ('name.csv') và lỗi nhắn là khác nhau (đối tượng "SparseDataFrame" không có thuộc tính 'toCSV' "). Vì vậy, các vấn đề đã được giải quyết bằng cách chuyển dataframe để dataframe dày đặc

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