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)?
7 answers
Aby rozgraniczyć tabulatorem, możesz użyć argumentu sep
to_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')
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
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ć.
Przypisy
- domyślnym separatorem jest przecinek (
','
). Nie zmieniaj tego, dopóki nie wiesz, że musisz.- 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 toTrue
).- 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.- 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).
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
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.
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')
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')
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