2017-03-15 42 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

由于它们的类型最有可能是相互穿插的,所以这是一个安全的选择。 –

相关问题