Zápis pandas DataFrame do súboru CSV

V programe pandas mám dátový rámec, ktorý by som chcel zapísať do súboru CSV. Robím to pomocou:

df.to_csv('out.csv')

A dostávam chybu:

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

Existuje nejaký spôsob, ako to jednoducho obísť (t. j. mám v dátovom rámci znaky unicode)? A existuje spôsob, ako zapisovať do súboru s tabuľkou namiesto CSV pomocou napr. metódy 'to-tab' (ktorá podľa mňa neexistuje)?

Riešenie

Na oddelenie tabulátorom môžete použiť argument sep príkazu to_csv:

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

Ak chcete použiť špecifické kódovanie (napr. 'utf-8'), použite argument encoding:

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

Ak máte problémy s kódovaním do 'utf-8' a chcete postupovať po jednotlivých bunkách, môžete skúsiť nasledovné.

Python 2

(Kde "df" je váš objekt 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

Potom skúste:

df.to_csv(file_name)

Kódovanie stĺpcov môžete skontrolovať pomocou:

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

Upozornenie: errors='ignore' len vynechá znak napr.

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
Komentáre (0)

Niekedy sa s týmito problémami stretávate, ak zadáte aj kódovanie UTF-8. Odporúčam vám, aby ste pri čítaní súboru zadali kódovanie a pri zápise do súboru rovnaké kódovanie. To by mohlo vyriešiť váš problém.

Komentáre (0)