从Python Pandas聚合结果格式化/抑制科学记数法

时间:2014-01-15 12:14:37

标签: python pandas floating-point scientific-notation number-formatting

如何修改pandas中groupby操作的输出格式,该pandas为非常大的数字生成科学记数法。我知道如何在python中进行字符串格式化,但是在这里应用它时我感到很茫然。

df1.groupby('dept')['data1'].sum()

dept
value1       1.192433e+08
value2       1.293066e+08
value3       1.077142e+08

如果我转换为字符串,这会抑制科学记数法,但现在我只是想知道如何将字符串格式化并添加小数。

sum_sales_dept.astype(str)

7 个答案:

答案 0 :(得分:167)

当然,我在评论中链接的答案并不是很有帮助。您可以像这样指定自己的字符串转换器。

In [25]: pd.set_option('display.float_format', lambda x: '%.3f' % x)

In [28]: Series(np.random.randn(3))*1000000000
Out[28]: 
0    -757322420.605
1   -1436160588.997
2   -1235116117.064
dtype: float64

我不确定这是否是首选方法,但它确实有效。

纯粹出于审美目的将数字转换为字符串似乎是一个坏主意,但如果你有充分的理由,这是一种方式:

In [6]: Series(np.random.randn(3)).apply(lambda x: '%.3f' % x)
Out[6]: 
0     0.026
1    -0.482
2    -0.694
dtype: object

答案 1 :(得分:52)

这是另一种方法,类似于Dan Allan's answer,但没有lambda函数:

>>> pd.options.display.float_format = '{:.2f}'.format
>>> Series(np.random.randn(3))
0    0.41
1    0.99
2    0.10

>>> pd.set_option('display.float_format', '{:.2f}'.format)

答案 2 :(得分:13)

您可以使用round函数来抑制特定数据帧的科学记数法:

df1.round(4)

或者你可以通过以下方式全局压制:

pd.options.display.float_format = '{:.4f}'.format

答案 3 :(得分:2)

在全局范围内设置固定的小数位数通常不是一个好主意,因为对于大小不一的所有各种数据,它不太可能是适当的小数位数。相反,请尝试使用此方法,该方法只会为大和非常小的值提供科学的表示法(除非省略“,”,否则会添加一个千位分隔符):

pd.set_option('display.float_format', lambda x: '%,g' % x)

或者为了几乎完全抑制科学计数法而不损失精度,请尝试以下方法:

pd.set_option('display.float_format', str)

答案 4 :(得分:1)

如果要在jupyter笔记本单元格中设置数据框输出的样式,可以在每个数据框的基础上设置显示样式:

df = pd.DataFrame({'A': np.random.randn(4)*1e7})
df.style.format("{:.1f}")

enter image description here

请参阅文档here

答案 5 :(得分:0)

如果您想使用这些值,比如csvfile csv.writer的一部分,可以在创建列表之前格式化数字:

public void read() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Press Enter to continue");
    try {
        System.in.read();
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (scanner.hasNextLine()) {
        scanner.nextLine(); // Remove '\n' from the buffer
        this.win();
    }
}

答案 6 :(得分:0)

我有多个具有不同浮点数的数据框,因此对Allans的想法是动态长度。

pd.set_option('display.float_format', lambda x: f'%.{len(str(x%1))-2}f' % x)

此方法的缺点是,如果浮点数中的最后0个,它将被切掉。因此它将不是0.000070,而是0.00007。