【问题标题】:Pandas to_csv how to format both int and float variables with comma as thousands separatorPandas to_csv 如何使用逗号作为千位分隔符格式化 int 和 float 变量
【发布时间】:2017-08-22 00:13:25
【问题描述】:

我处理的所有数据都需要用逗号作为千位分隔符报告。在将数据写入 .csv 文件后,我只对以逗号作为千位分隔符的值感兴趣。在我的熊猫数据框内部,我想将它们保持为 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 函数对其进行格式化。有什么想法吗?

【问题讨论】:

  • 如您所见,pandas 目前不支持新样式的格式字符串:github.com/pandas-dev/pandas/issues/2502
  • 您使用的术语“逗号分隔值”是错误的,您的意思不是 CSV,您的意思是“逗号作为千位分隔符”。

标签: python pandas csv number-formatting


【解决方案1】:

这对你来说可能太笨拙了。无论如何,这里是。使用这个答案https://stackoverflow.com/a/4205875/42346,我们可以使用逗号:

def thous(x, sep=',', dot='.'):
    num, _, frac = str(x).partition(dot)
    num = re.sub(r'(\d{3})(?=\d)', r'\1'+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

【讨论】:

  • 它似乎可以满足我的需要,但我希望它四舍五入,所以我修改了:def thous(x, sep=',', dot='.'): y = round(x) num, _, frac = str(y).partition(dot) num = re.sub(r'(\d{3})(?=\d)', r'\1'+sep, num[::-1])[::-1] # if frac: # num += dot + frac return num
  • 然后循环浏览我的数据框:for x in list(df): df[x] = df[x].apply(lambda x: thous(x)) 所以谢谢!
  • 干杯,伙计。很高兴你提出了这个修改。顺便说一句,我很嫉妒你只使用 CSV!
  • csv 是最终产品,开始时有很多古怪的东西。感谢您的帮助!
【解决方案2】:

这是我根据上面 bernie 的回答得到的代码。我想在这里发布给其他人。

import re
def thous(x, sep=',', dot='.'):
   y = round(x)
   num, _, frac = str(y).partition(dot)
   num = re.sub(r'(\d{3})(?=\d)', r'\1'+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 命令之前运行它,你就可以了。干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    • 2016-09-23
    • 2020-05-29
    • 2022-12-06
    相关资源
    最近更新 更多