pandas DataFrame 中的自定义浮点格式

Posted

技术标签:

【中文标题】pandas DataFrame 中的自定义浮点格式【英文标题】:Customized float formatting in a pandas DataFrame 【发布时间】:2017-08-01 19:27:47 【问题描述】:

我有一个DataFrame

   0       1
0  3.000   5.600
1  1.200   3.456

出于演示目的,我希望将其转换为

   0    1
0  3    5.6
1  1.2  3.456

实现此目的的优雅方法是什么(不会在DataFrame 的条目上进行低效循环)?

或者更一般地说:有没有办法设置pandas 使其始终这样做?例如。 pandas 选项之一?

请注意,pd.options.display.float_format = ':,.0f'.format 将不起作用,因为它会给出固定的小数位数,而不是像我上面指出的那样在 DataFrame 的条目之间变化。

【问题讨论】:

how-to-display-pandas-dataframe-of-floats-using-a-format-string-for-columns的可能重复 【参考方案1】:

如果有人想要一种快速的方法来对数据框中的所有数字类型应用相同的精度(而不是担心 str 类型):

pd.set_option('display.precision', 2)

这适用于在 jupyter 笔记本中显示 DataFrame 和 Styler 对象。

【讨论】:

【参考方案2】:

我的答案是对 /u/SEDaradji 给出的答案的修改,即使有 NaN 或 Infs,应该工作

pd.options.display.float_format = lambda x : ':,.2f'.format(x) if (np.isnan(x) | np.isinf(x)) else ':,.0f'.format(x) if int(x) == x else ':,.2f'.format(x)

【讨论】:

【参考方案3】:
df["column"] = df["column"].astype("float").round(3)

【讨论】:

请为您的单行代码提供更多信息,以及为什么 4 年后这对原始海报 (OP) 的问题更有用。 这不会按照问题中的具体要求从浮点数中删除尾随零。【参考方案4】:

一个很好的解决方案来测试值是否有小数部分并相应地格式化:

pd.options.display.float_format = lambda x : ':.0f'.format(x) if int(x) == x else ':,.2f'.format(x)

编辑:当您的数据中有 NaN 时,这将产生错误。考虑改为使用 round(): pd.options.display.float_format = lambda x : ':.0f'.format(x) if round(x,0) == x else ':,.2f'.format(x)

【讨论】:

【参考方案5】:

一个使用round()的简单方法,将要四舍五入的位数作为参数传递。

假设您的 DataFrame 名为“df”:

df.round(2)

输出:

   0     1
0  3.00  5.60
1  1.20  3.45

【讨论】:

这对我不起作用。它不会对数字进行四舍五入。 起初,这不起作用。我的 df 里面有字符串而不是数字。 @SteveGon 很高兴它成功了。我的第一步是在加载数据集后使用 .info() 方法来识别和验证数据类型。【参考方案6】:
In [188]: df
Out[188]:
       a      b       c
0 1.0000 2.2460  2.0000
1 3.0000 4.4920  6.0000
2 5.0000 6.7380 10.0000

In [189]: pd.options.display.float_format = ':,.2f'.format

In [190]: df.apply(lambda x: x.astype(int) if np.allclose(x, x.astype(int)) else x)
Out[190]:
   a    b   c
0  1 2.25   2
1  3 4.49   6
2  5 6.74  10

更新:

In [222]: df
Out[222]:
       0      1
0 3.0000 5.6000
1 1.2000 3.4560

In [223]: df.applymap(lambda x: str(int(x)) if abs(x - int(x)) < 1e-6 else str(round(x,2)))
Out[223]:
     0     1
0    3   5.6
1  1.2  3.46

注意:请注意,.applymap() 方法非常慢,因为它为 DataFrame 中的每个系列执行 map(func, series)

【讨论】:

您可以在不更改原始值的情况下格式化数据here

以上是关于pandas DataFrame 中的自定义浮点格式的主要内容,如果未能解决你的问题,请参考以下文章

python pandas中如何将dataframe中的一列字符串类型转换为浮点类型?

Matplotlib:pandas MultiIndex DataFrame 的自定义代码

尝试从 Pandas DataFrame 中的字典访问第一个值时出现浮点错误

如何修改 pandas DataFrame 中的单元格?

如何编辑多个 Pandas DataFrame 浮点列的字符串格式?

使用 iloc 为 pandas DataFrame 中的特定单元格设置值