插件窝 干货文章 Pandas分组求和后CSV文件精度丢失怎么办?

Pandas分组求和后CSV文件精度丢失怎么办?

精度 使用 保存 DataFrame 135    来源:    2025-03-15

在使用Pandas进行分组求和操作后,将结果保存为CSV文件时,可能会遇到精度丢失的问题。这通常是因为CSV文件默认使用有限的精度来存储浮点数。为了保持数据的精度,可以采取以下几种方法:

1. 使用float_format参数

在保存CSV文件时,可以使用to_csv方法的float_format参数来指定浮点数的格式。例如,可以使用%.10f来保留10位小数。

import pandas as pd

# 假设df是你的DataFrame
df = pd.DataFrame({
    'A': [1.123456789, 2.123456789, 3.123456789],
    'B': [4.123456789, 5.123456789, 6.123456789]
})

# 分组求和
grouped_df = df.groupby('A').sum()

# 保存到CSV文件,保留10位小数
grouped_df.to_csv('output.csv', float_format='%.10f')

2. 使用decimal参数

如果你需要更高的精度,可以考虑使用decimal模块来处理浮点数。decimal模块提供了更高的精度和更好的控制。

import pandas as pd
from decimal import Decimal, getcontext

# 设置decimal的精度
getcontext().prec = 20

# 假设df是你的DataFrame
df = pd.DataFrame({
    'A': [Decimal('1.1234567890123456789'), Decimal('2.1234567890123456789')],
    'B': [Decimal('4.1234567890123456789'), Decimal('5.1234567890123456789')]
})

# 分组求和
grouped_df = df.groupby('A').sum()

# 保存到CSV文件
grouped_df.to_csv('output.csv', index=False)

3. 使用numpy的高精度浮点数

如果你需要更高的精度,可以考虑使用numpy的高精度浮点数类型(如float128)。

import pandas as pd
import numpy as np

# 假设df是你的DataFrame
df = pd.DataFrame({
    'A': [np.float128(1.1234567890123456789), np.float128(2.1234567890123456789)],
    'B': [np.float128(4.1234567890123456789), np.float128(5.1234567890123456789)]
})

# 分组求和
grouped_df = df.groupby('A').sum()

# 保存到CSV文件
grouped_df.to_csv('output.csv', index=False)

4. 使用to_csvquoting参数

如果你需要确保数据在CSV文件中完全按照原始格式保存,可以使用quoting参数来确保所有字段都被引号包围。

import pandas as pd

# 假设df是你的DataFrame
df = pd.DataFrame({
    'A': [1.123456789, 2.123456789, 3.123456789],
    'B': [4.123456789, 5.123456789, 6.123456789]
})

# 分组求和
grouped_df = df.groupby('A').sum()

# 保存到CSV文件,确保所有字段都被引号包围
grouped_df.to_csv('output.csv', float_format='%.10f', quoting=1)

5. 使用to_pickle保存数据

如果你不需要将数据保存为CSV格式,可以考虑使用to_pickle方法将数据保存为二进制文件,这样可以完全保留数据的精度。

import pandas as pd

# 假设df是你的DataFrame
df = pd.DataFrame({
    'A': [1.123456789, 2.123456789, 3.123456789],
    'B': [4.123456789, 5.123456789, 6.123456789]
})

# 分组求和
grouped_df = df.groupby('A').sum()

# 保存为pickle文件
grouped_df.to_pickle('output.pkl')

总结

通过以上方法,你可以在保存CSV文件时避免精度丢失的问题。根据你的具体需求,可以选择适合的方法来确保数据的精度。