Zapisanie ramki danych pandy do pliku CSV

Mam w Pandzie ramkę danych, którą chciałbym zapisać do pliku CSV. Robię to używając:

df.to_csv('out.csv')

I uzyskanie błędu:

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

Czy Jest jakiś sposób, aby obejść to łatwo (tzn. mam znaki unicode w ramce danych)? A czy jest sposób na zapis do pliku rozdzielanego tabulatorami zamiast pliku CSV przy użyciu np. metody 'to-tab' (która chyba nie istnieje)?

Author: cs95, 2013-06-04

7 answers

Aby rozgraniczyć tabulatorem, możesz użyć argumentu septo_csv:

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

Aby użyć określonego kodowania (np. 'utf-8') użyj argumentu encoding:

df.to_csv(file_name, sep='\t', encoding='utf-8')
 1145
Author: Andy Hayden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 16:52:17

Gdy przechowujesz obiekt DataFrame do pliku csv używając metody to_csv, prawdopodobnie nie będziesz musiał przechowywać poprzedzających indeksów KAŻDEGO wiersza obiektu DataFrame.

Możesz tego uniknąć, przekazując False wartość logiczną do parametru index.

Trochę jak:

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

Więc jeśli twój obiekt DataFrame jest czymś w stylu:

  Color  Number
0   red     22
1  blue     10

Plik csv będzie przechowywał:

Color,Number
red,22
blue,10

Zamiast (przypadek, gdy wartość domyślna True został przekazany)

,Color,Number
0,red,22
1,blue,10
 277
Author: Sayan Sil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-07 22:10:48

Aby zapisać ramkę danych pandy do pliku CSV, musisz DataFrame.to_csv. Ta funkcja oferuje wiele argumentów z rozsądnymi wartościami domyślnymi, które częściej niż nie trzeba nadpisywać, aby pasowały do konkretnego przypadku użycia. Na przykład podczas zapisu można użyć innego separatora, zmienić format datetime lub upuścić indeks. to_csv ma argumenty, które możesz przekazać, aby spełnić te wymagania.

Oto tabela z listą typowych scenariuszy zapisu do CSV pliki i odpowiadające im argumenty, których możesz dla nich użyć.

Napisz do CSV ma dude

Przypisy

  1. domyślnym separatorem jest przecinek (','). Nie zmieniaj tego, dopóki nie wiesz, że musisz.
  2. domyślnie indeks df jest zapisywany jako pierwsza kolumna. Jeśli twoja ramka Danych nie ma indeksu (IOW, df.index jest domyślną RangeIndex), wtedy będziesz chciał ustawić index=False podczas pisania. Aby wyjaśnić to w inny sposób, jeśli Twoje dane jeśli masz indeks, możesz (i powinieneś) użyć index=True lub po prostu go całkowicie pominąć(domyślnie jest to True).
  3. mądrze byłoby ustawić ten parametr, jeśli piszesz dane łańcuchowe, aby inne aplikacje wiedziały, jak odczytywać Twoje dane. Pozwoli to również uniknąć potencjalnych UnicodeEncodeError s, które możesz napotkać podczas zapisywania.
  4. kompresja jest zalecana w przypadku zapisu dużych ramek danych (>100k wierszy) na dysk, ponieważ spowoduje to powstanie znacznie mniejszych plików wyjściowych. OTOH, będzie to oznaczać czas zapisu wzrośnie (a co za tym idzie, czas odczytu, ponieważ plik będzie musiał zostać zdekompresowany).
 31
Author: cs95,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Coś jeszcze możesz spróbować jeśli masz problemy z kodowaniem do 'utf-8' i chcesz przejść do komórki po komórce możesz spróbować następujących czynności.

Python 2

(Gdzie " df " jest Twoim obiektem 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

Następnie spróbuj:

df.to_csv(file_name)

Możesz sprawdzić kodowanie kolumn przez:

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

Warning: errors= 'ignore' po prostu pominie znak np.

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
 21
Author: Glen Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-01 17:38:37

Czasami napotkasz te problemy, jeśli podasz kodowanie UTF-8 również. Polecam określić kodowanie podczas odczytu pliku i to samo kodowanie podczas zapisu do pliku. To może rozwiązać twój problem.

 14
Author: Harsha Komarraju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-19 13:15:09

Przykład eksportu do pliku z pełną ścieżką w systemie Windows i w przypadku, gdy plik zawiera nagłówki :

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

Na przykład, jeśli chcesz zapisać plik w tym samym katalogu, w którym znajduje się skrypt, z kodowaniem utf-8 i tabulatorem jako separatorem:

df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header='true')
 14
Author: Harvey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-15 04:26:38

Może to nie być odpowiedź w tym przypadku, ale ponieważ miałem ten sam komunikat o błędzie z .to_csv próbowałem .toCSV('name.csv') i Komunikat o błędzie był inny ("SparseDataFrame' object has no attribute 'toCSV'). Tak więc problem został rozwiązany poprzez przekształcenie dataframe w gęste dataframe

df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')
 8
Author: Yury Wallet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-19 19:42:26