2017-05-11 4 views
0

Mismatch Ich habe dieses merkwürdige Problem mit Pandas (Python 3.5)Pandas to_csv und from_csv, die Anzahl der reords

ich einen Datenrahmen speichere in CSV und dann die gleiche Datei wieder in einen Datenrahmen zu lesen. Ich erhalte eine unterschiedliche Anzahl von Datensätzen im neuen Datenrahmen. Das Merkwürdige ist, dass die Anzahl der Datensätze gestiegen ist !!

data_n.to_csv('file1.csv') 

data_n1=pd.read_csv('file1.csv') 

print (len(data_n),len(data_n1),len(data_n1)-len(data_n)) 

206637 208299 1662 

Hier ist ein Code, der das Problem demonstriert:

import pandas as pd 

orig = pd.DataFrame({'url':['foo\rbar', 'baz'], 'col':[1, 2]}) 
orig['idx'] = range(len(orig)) 
print(orig) 
# col  url idx 
# 0 1 foo\rbar 0 
# 1 2  baz 1 
orig.to_csv('/tmp/file1.csv') 

new = pd.read_csv('/tmp/file1.csv') 
print(new) 
# Unnamed: 0 col url idx 
# 0   0 1 foo NaN 
# 1  bar 0 NaN NaN 
# 2   1 2 baz 1.0 
+5

Es könnte uns helfen, das Problem zu identifizieren, wenn wir sehen, wie einige der zusätzlichen Zeilen aussehen. Wenn 'data_n' einen eindeutigen Index hat, können Sie' df = data_n1.loc [data_n1.index.difference (data_n.index)] 'verwenden, um die zusätzlichen Zeilen zu isolieren. Wenn wir 'df.reset_index(). Head(). To_dict ('list')' posten, würde uns zeigen, wie einige dieser Zeilen eindeutig aussehen – unutbu

+0

Vielen Dank für Ihre Antwort. Ich habe Ihren Code verwendet und habe das Problem auf ein Feld isoliert, das Website-URLs speichert. Einige von ihnen haben am Ende ein '\ r'. Es ist vom Typ str. In diesen Fällen erstellt Pandas eine zusätzliche Zeile mit dem Indexwert anstelle der Website. –

+0

macht es auch etwas anderes, was sehr merkwürdig ist. Ich habe einen Index hinzugefügt: idx = Bereich (len (Daten)) Daten ['idx'] = idx Drucken (Typ (Daten ['Idx']. Iloc [0])), Daten ['Idx'] .iloc [0]. Ich bekomme Folgendes: 210885 Out [47]: (None, 0) –

Antwort

1

Der Parser CSV genannt durch pd.read_csv interpretiert ein unquoted \r als End-of-line. Um das \r davor zu schützen, als Zeilenende interpretiert zu werden, übergeben Sie quoting=csv.QUOTE_NONNUMERIC oder quoting=csv.QUOTE_ALL an den to_csv Aufruf. Um Pandas zu erzählen die erste Spalte als Index zu interpretieren, übergeben index_col=0-pd.read_csv:

import csv 
import pandas as pd 

orig = pd.DataFrame({'url':['foo\rbar', 'baz'], 'col':[1, 2]}) 
orig['idx'] = range(len(orig)) 
print(orig) 
# col  url idx 
# 0 1 foo\rbar 0 
# 1 2  baz 1 
orig.to_csv('/tmp/file1.csv', quoting=csv.QUOTE_NONNUMERIC) 

new = pd.read_csv('/tmp/file1.csv', index_col=0) 
print(new) 
# col  url idx 
# 0 1 foo\rbar 0 
# 1 2  baz 1 

Alternativ, wenn Sie nicht benötigen oder wünschen orig.index zu behalten, Sie den Index aus der CSV weglassen könnte mit

orig.to_csv('/tmp/file1.csv', quoting=csv.QUOTE_NONNUMERIC, index=False) 
new = pd.read_csv('/tmp/file1.csv') 
Verwandte Themen