【问题标题】:Is it possible to format numbers in a Data Frame without turning them into strings?是否可以在数据框中格式化数字而不将它们转换为字符串?
【发布时间】:2019-11-26 09:52:07
【问题描述】:

我想将数据框以 xls 格式导出到 Excel,并以 1000 位分隔符和 2 个小数位显示数字,并将百分比显示为 2 个小数点的 %,例如54356 为 54,356.00 和 0.0345 为 3.45%

当我使用 .map() 和 .format 在 python 中更改格式时,它会在 python 中正确显示它们,但会将它们转换为字符串,并且当我将它们导出到 xls 时,Excel 不会将它们识别为数字/百分比。

import pandas as pd

d = {'Percent': [0.01, 0.0345], 'Number': [54464.43, 54356]}
df = pd.DataFrame(data=d)

df['Percent'] = pd.Series(["{0:.2f}%".format(val * 100) for val in df['Percent']], index = df.index)

df['Number'] = df['Number'].map('{:,.2f}'.format)

数据框看起来像预期的那样,但是单元格的类型现在是 str,如果我将其导出到 xls (df.to_excel('file.xls')),Excel 会显示“此单元格中的数字已格式化作为文本或前面有撇号”警告。

【问题讨论】:

  • 不是您问题的答案,但百分比有自己的格式代码。 df.Percent.map('{:.2%}'.format)
  • 写入excel时可以指定float_format。遗憾的是,这是所有列的一种格式,并且不接受 {col: format_str} 的字典,因此它不是一个完美的解决方案,因为您需要 % 符号。

标签: python pandas dataframe numbers format


【解决方案1】:

显示DataFrame的时候可以编辑style属性,但是底层数据没有被触动

df.style.format({
    'Number': '{0:.2f}'.format, 
    'Percent': '{0:.2%}'.format,
})

见:pandas style guide

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您的目标是输出 excel 文件中实际单元格的格式。为此,您可能希望专注于实际文件,而不是在 pandas DataFrame 中进行格式化(即您的数据是正确的,问题在于它们在输出中的显示方式)。

    您可能想尝试类似this

    【讨论】:

      【解决方案3】:

      也许 lambda 会更有帮助

      df['Percent'] = df['Percent'].apply(lambda x: round(x*100, 2))
      df['Number'] = df['Number'].apply(lambda x: round(x, 2))
      

      【讨论】:

        【解决方案4】:
        • 对于 df["Number"]df.Number = df.Number.apply(lambda x : '{0:,.2f}'.format(x)) 将起作用

        • 对于 df["Percent"] :首先将系列乘以 100。df["Percent"] = df.Percent.multiply(100)

          • 然后使用df.Percent = df.Percent.apply(lambda x: "{0:.2f}%".format(x))

        希望对你有帮助

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-20
          • 1970-01-01
          • 2020-12-30
          • 2021-12-30
          • 2012-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多