Написання файлів пандес DataFrame у файл CSV


714

У мене є фрейм даних у пандах, які я хотів би записати у файл CSV. Я роблю це, використовуючи:

df.to_csv('out.csv')

І отримання помилки:

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

Чи є спосіб обійти це легко (тобто в моєму кадрі даних є символи unicode)? І чи є спосіб записати у файл з обмеженими вкладками замість CSV, наприклад, методом "до вкладки" (що, на мою думку, не існує)?

Відповіді:


1045

Для розмежування по вкладці можна використовувати sepаргумент to_csv:

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

Для використання конкретного кодування (наприклад, 'utf-8') використовуйте encodingаргумент:

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

32
Я б додав, index=Falseщоб скинути індекс.
Медхат

11
Мене спочатку збентежило те, як я знайшов відповідь на запитання, яке я вже писав 7 років тому.
Гайден

250

При збереженні DataFrameоб'єкта в файл CSV , використовуючи to_csvметод, ви , ймовірно , не буде необхідності зберігати попередні показники кожної рядки з DataFrameоб'єкта.

Ви можете уникнути цього, передавши Falseбулеве значення indexпараметру.

Дещо як:

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

Тож якщо ваш об’єкт DataFrame має щось подібне:

  Color  Number
0   red     22
1  blue     10

Файл csv зберігатиме:

Color,Number
red,22
blue,10

замість (випадок, коли значення за замовчуваннямTrue було передано)

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

Що робити, якщо індексація бажана, але також повинна мати назву? Ви просто використовуєте df.rename_axis('index_name')? це не змінює сам файл
Зап

19

Щоб написати пандус DataFrame у файл CSV, вам знадобиться DataFrame.to_csv. Ця функція пропонує безліч аргументів з розумними за замовчуванням, які вам частіше за все не потрібно буде переосмислювати, щоб відповідати вашому конкретному випадку використання. Наприклад, ви можете скористатися іншим роздільником, змінити формат часу дати або скинути індекс під час написання. to_csvмає аргументи, які можна надати для вирішення цих вимог.

Ось таблиця з переліком деяких загальних сценаріїв запису у файли CSV та відповідних аргументів, які ви можете використовувати для них.

Напишіть у CSV ma dude

Виноски

  1. Розділювачем за замовчуванням вважається кома ( ','). Не змінюйте цього, якщо ви не знаєте, що вам потрібно.
  2. За замовчуванням, індекс dfзаписується як перший стовпець. Якщо у вашій DataFrame немає індексу (IOW, df.indexза замовчуванням RangeIndex, то ви хочете встановити index=Falseпри написанні). Щоб пояснити це по-іншому, якщо ваші дані НЕ мають індекс, ви можете (і повинні) використовувати index=Trueабо просто залишити його повністю (як за замовчуванням True).
  3. Було б розумно встановити цей параметр, якщо ви записуєте рядкові дані, щоб інші програми знали, як читати ваші дані. Це також дозволить уникнути потенційних можливостей, UnicodeEncodeErrorз якими ви можете зіткнутися, зберігаючи.
  4. Стиснення рекомендується, якщо ви записуєте великі DataFrames (> 100K рядків) на диск, оскільки це призведе до набагато менших вихідних файлів. OTOH, це означає, що час запису збільшиться (і, отже, час читання, оскільки файл потрібно буде декомпресувати).

18

Ще щось, що ви можете спробувати, якщо у вас виникають проблеми з кодуванням до 'utf-8' і хочете переходити по клітинках, ви можете спробувати наступне.

Пітон 2

(Де "df" - ваш об'єкт DataFrame.)

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

Потім спробуйте:

df.to_csv(file_name)

Ви можете перевірити кодування стовпців:

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

Попередження: error = 'ignore' просто опустить символ, наприклад

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

Пітон 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

Іноді ви стикаєтеся з цими проблемами, якщо ви також вказали кодування UTF-8. Я рекомендую вам вказати кодування під час читання файлу та таке ж кодування під час запису у файл. Це може вирішити вашу проблему.


7

Приклад експорту у файл із повним шляхом у Windows та у випадку, якщо ваш файл має заголовки :

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

Приклад, якщо ви хочете зберігати папку в тому самому каталозі, де знаходиться ваш скрипт, з кодуванням utf-8 та вкладкою як роздільник :

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

7

це може бути не відповіддю для цього випадку, але, як у мене було те саме повідомлення про помилку, .to_csvя намагався, .toCSV('name.csv')і повідомлення про помилку було іншим (" SparseDataFrame' object has no attribute 'toCSV'). Тому проблема була вирішена шляхом перетворення фрейму даних на щільний фрейм даних

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

Ви отримали помилку у другій, оскільки вона виглядає так, як ви використовували, .toCSVа ні .to_csv. Ви забули підкреслення
Kyle C
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.