Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pandas DataFrame to csv: Specifying decimal separator for mixed type

Tags:

python

pandas

csv

I've found a somewhat strange behaviour when I create a Pandas DataFrame from lists and convert it to csv with a specific decimal separator.

This works as expected:

>>> 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'

However, in this case the decimal separator is not set properly:

>>> 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'

When I transpose b in order to get a DataFrame like a the decimal separator is still not properly set:

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

Why I am asking: In my program I have columns as individual lists (e.g. col1 = ['a', 'b'] and col2 = [0.1, 0.2], but the number and format of columns can vary) and I would like to convert them to csv with a specific decimal separator, so I'd like to have an output like

' 0 1\n0 a 0,1\n1 b 0,2\n'
like image 465
elzell Avatar asked Nov 29 '25 16:11

elzell


1 Answers

Use applymap and cast the float typed cells to str by checking explicitly for their type. Then, replace the decimal dot(.) with the comma (,) as each cell now constitutes a string and dump the contents to a csv file later.

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'
like image 164
Nickil Maveli Avatar answered Dec 02 '25 06:12

Nickil Maveli



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!