2017-05-11 65 views
0

我有熊貓這種奇怪的問題(蟒蛇3.5)大熊貓to_csv和from_csv,reords的號不匹配

我節省了數據幀到csv,然後讀同一文件恢復到數據幀。我在新的數據框中獲得不同數量的記錄。 奇怪的是,記錄數量增加了!

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 

下面是一些代碼這表明該問題:

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

如果我們看到某些額外的行看起來像什麼,它可能會幫助我們識別問題。如果'data_n'具有唯一索引,則可以使用'df = data_n1.loc [data_n1.index.difference(data_n.index)]'來隔離額外的行。發佈'df.reset_index()。head()。to_dict('list')'會以明確的方式向我們展示這些行中的幾個看起來像什麼 – unutbu

+0

感謝您的迴應。我使用了你的代碼,並且一直將問題隔離到存儲網站URL的字段。其中一些最終有'\ r'。它是str型。對於這些情況,熊貓正在創建一個額外的索引值來代替網站。 –

+0

它也在做別的奇怪的事情。我添加了一個索引: idx = range(len(data)) data ['idx'] = idx print(type [data ['idx']。iloc [0])),data ['idx'] .iloc [0]。我得到以下內容:210885 Out [47]: (None,0) –

回答

1

的CSV解析器通過pd.read_csv稱爲解釋非引用\r作爲結束線。 爲了防止\r被解釋爲行結束,請將quoting=csv.QUOTE_NONNUMERICquoting=csv.QUOTE_ALL傳遞給to_csv調用。告訴熊貓來解釋第一欄爲指標,通過index_col=0pd.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 

另外,如果你不需要或不希望保留orig.index,你可以使用省略 從CSV指數

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