2017-03-15 73 views
2

當我從列表創建一個Pandas DataFrame並將其轉換爲具有特定小數點分隔符的csv時,我發現有點奇怪的行爲。Pandas DataFrame to csv:爲混合類型指定小數點分隔符

這按預期工作:

>>> import pandas as pd 
>>> a = pd.DataFrame([['a', 0.1], ['b', 0.2]]) 
>>> a 
    0 1 
0 a 0.1 
1 b 0.2 
>>> a.to_csv(decimal=',', sep=' ') 
' 0 1\n0 a 0,1\n1 b 0,2\n' 

然而,在這種情況下,小數點設置不正確:

>>> b = pd.DataFrame([['a', 'b'], [0.1, 0.2]]) 
>>> b 
    0 1 
0 a b 
1 0.1 0.2 
>>> b.to_csv(decimal=',', sep=' ') 
' 0 1\n0 a b\n1 0.1 0.2\n' 

當我爲了得到像a小數點一個數據幀轉b分離器仍未正確設置:

>>> b.T.to_csv(decimal=',', sep=' ') 
' 0 1\n0 a 0.1\n1 b 0.2\n' 

爲什麼我問:在我的程序中,我有列作爲單獨的列表(例如, col1 = ['a', 'b']col2 = [0.1, 0.2],但是列數和格式可能有所不同),我想將它們轉換與特定小數點分隔到CSV,所以我想有一個像輸出

' 0 1\n0 a 0,1\n1 b 0,2\n' 
+0

你使用的是什麼版本的熊貓?小數只在0.16以後加上 –

+0

@NickHale我使用0.18.1 – elzell

回答

1

使用applymap和投通過明確檢查其類型,float將單元格鍵入str。然後,將小數點(.)替換爲逗號(,),因爲每個單元格現在構成一個字符串,並稍後將內容轉儲到csv文件。

b.applymap(lambda x: str(x).replace(".", ",") if isinstance(x, float) else x).to_csv(sep=" ") 
# ' 0 1\n0 a b\n1 0,1 0,2\n' 
+0

感謝您的建議,但我更願意看到這更多作爲最後的手段,當沒有其他方式,因爲我的字符串列也可以包含點(字符串列包含文件名),也將被轉換。 – elzell

+0

現在至少這是一個很好的解決方法:) – elzell

+0

由於它們的類型最有可能是相互穿插的,所以這是一個安全的選擇。 –

相關問題