Pandas to_csv 如何使用逗号作为千位分隔符来格式化 int 和 float 变量
Pandas to_csv how to format both int and float variables with comma as thousands separator
我处理的所有数据都需要用逗号作为千位分隔符来报告。在将数据写入 .csv 文件后,我只对以逗号作为千位分隔符的值感兴趣。在我的 pandas 数据框内部,我想将它们保留为 int 或 float。
浮动
我可以将浮点数输出为零小数:
df.to_csv('c:\Awesome\Groovy.csv', float_format = '%.0f')
但每当我尝试在浮动中添加逗号时,它都不起作用。
df.to_csv('c:\Awesome\Groovy.csv', float_format = ':,.0f') ## WRONG
df.to_csv('c:\Awesome\Groovy.csv', float_format = {:,.0f}'.format) ## WRONG
整数
我对整数的计划是,首先将它们转换为数据帧中的浮点数,然后使用 .to_csv 函数对其进行格式化。有什么想法吗?
这对你来说可能太笨拙了。无论如何,这里是。使用这个答案 我们可以使用逗号:
def thous(x, sep=',', dot='.'):
num, _, frac = str(x).partition(dot)
num = re.sub(r'(\d{3})(?=\d)', r''+sep, num[::-1])[::-1]
if frac:
num += dot + frac
return num
df['my_column'] = df['my_column'].apply(lambda x: thous(x))
使用我从另一个 SO 问题中得到的一些示例数据:
>>> df = pd.DataFrame({'date':['2017-03-10','2017-03-11','2017-03-12'],
'activate_time':['2017-03-10 12:13:30','2017-03-11 13:57:49','2017-03-12 14:28:05'],
'mycol':[1234.56789,9876.54321,1111111.11111]})
>>> df['mycol'] = df['mycol'].apply(lambda x: thous(x))
>>> df
activate_time date mycol
0 2017-03-10 12:13:30 2017-03-10 1,234.56789
1 2017-03-11 13:57:49 2017-03-11 9,876.54321
2 2017-03-12 14:28:05 2017-03-12 1,111,111.11111
这是我根据上面伯尼的回答得到的代码。我想post在这里为其他人。
import re
def thous(x, sep=',', dot='.'):
y = round(x)
num, _, frac = str(y).partition(dot)
num = re.sub(r'(\d{3})(?=\d)', r''+sep, num[::-1])[::-1]
# comment out for no 0 if frac:
# comment out for no 0 num += dot + frac
return num
num = df.select_dtypes(include=[np.number]) #selects only numeric dtypes
for x in num:
df[x] = df[x].apply(lambda x: thous(x))
运行 它就在您使用 to_csv 命令之前,您是黄金。干杯!
我处理的所有数据都需要用逗号作为千位分隔符来报告。在将数据写入 .csv 文件后,我只对以逗号作为千位分隔符的值感兴趣。在我的 pandas 数据框内部,我想将它们保留为 int 或 float。
浮动
我可以将浮点数输出为零小数:
df.to_csv('c:\Awesome\Groovy.csv', float_format = '%.0f')
但每当我尝试在浮动中添加逗号时,它都不起作用。
df.to_csv('c:\Awesome\Groovy.csv', float_format = ':,.0f') ## WRONG
df.to_csv('c:\Awesome\Groovy.csv', float_format = {:,.0f}'.format) ## WRONG
整数
我对整数的计划是,首先将它们转换为数据帧中的浮点数,然后使用 .to_csv 函数对其进行格式化。有什么想法吗?
这对你来说可能太笨拙了。无论如何,这里是。使用这个答案 我们可以使用逗号:
def thous(x, sep=',', dot='.'):
num, _, frac = str(x).partition(dot)
num = re.sub(r'(\d{3})(?=\d)', r''+sep, num[::-1])[::-1]
if frac:
num += dot + frac
return num
df['my_column'] = df['my_column'].apply(lambda x: thous(x))
使用我从另一个 SO 问题中得到的一些示例数据:
>>> df = pd.DataFrame({'date':['2017-03-10','2017-03-11','2017-03-12'],
'activate_time':['2017-03-10 12:13:30','2017-03-11 13:57:49','2017-03-12 14:28:05'],
'mycol':[1234.56789,9876.54321,1111111.11111]})
>>> df['mycol'] = df['mycol'].apply(lambda x: thous(x))
>>> df
activate_time date mycol
0 2017-03-10 12:13:30 2017-03-10 1,234.56789
1 2017-03-11 13:57:49 2017-03-11 9,876.54321
2 2017-03-12 14:28:05 2017-03-12 1,111,111.11111
这是我根据上面伯尼的回答得到的代码。我想post在这里为其他人。
import re
def thous(x, sep=',', dot='.'):
y = round(x)
num, _, frac = str(y).partition(dot)
num = re.sub(r'(\d{3})(?=\d)', r''+sep, num[::-1])[::-1]
# comment out for no 0 if frac:
# comment out for no 0 num += dot + frac
return num
num = df.select_dtypes(include=[np.number]) #selects only numeric dtypes
for x in num:
df[x] = df[x].apply(lambda x: thous(x))
运行 它就在您使用 to_csv 命令之前,您是黄金。干杯!