缩短 Pandas 数据框的十进制数,与 Python 的十进制模块一样
Shorten decimal numbers of Pandas dataframe as with Python's decimal modules
我有几个这样的数据框。
data = {'col1': [3.1415926535, 28, -0.0000000000000000618, 1.100000001],
'col2': ['string1', 'string2', 'string3', 'string4'],
'col3': [9876543210, 0, 333.3333333, np.nan],
'col4': [np.nan] * 4}
df = pd.DataFrame(data, index=[1001, 1002, 1003, 1004])
print(df)
col1 col2 col3 col4
1001 3.141593e+00 string1 9.876543e+09 NaN
1002 2.800000e+01 string2 0.000000e+00 NaN
1003 -6.180000e-17 string3 3.333333e+02 NaN
1004 1.100000e+00 string4 NaN NaN
它们都有数千行和数百列,并以 CSV 格式存储。
出于存储经济的原因,我想在将数据帧中包含的每个值保存到 csv 之前优化它们的精度。
对于4位的精度,这可能会给出以下结果。
col1 col2 col3 col4
1001 3.141e+00 string1 9.876e+09 NaN
1002 2.8e+01 string2 0e+00 NaN
1003 -6.18e-17 string3 3.333e+02 NaN
1004 1.1e+00 string4 NaN NaN
有时同一列中的范围很大,“舍入”方法不适合我的情况,因为它不允许我在大值和小值之间保持相似的精度。我也用“df.to_csv()”命令测试了“float_format”参数,但它也不符合我的需要。
Python's Decimal library满足了这个需求,但是我没能在dataframe上应用。
您有有效应用此类处理的解决方案吗?
注意: 如果预期值为“1.1e+00”,我也可以接受“1.1”格式,一旦存储在 CSV 中会更经济。但是对于太极端或太接近于零的数字,这种格式可能并不理想......因此科学记数法似乎更适合我。
运行 显示DF之前的这条命令:
pd.options.display.float_format = "{:,.4E}".format
或者,如果您只需要几行,例如:
df['col1'] = df['col1'].map('${:,.4E}'.format)
我有几个这样的数据框。
data = {'col1': [3.1415926535, 28, -0.0000000000000000618, 1.100000001],
'col2': ['string1', 'string2', 'string3', 'string4'],
'col3': [9876543210, 0, 333.3333333, np.nan],
'col4': [np.nan] * 4}
df = pd.DataFrame(data, index=[1001, 1002, 1003, 1004])
print(df)
col1 col2 col3 col4
1001 3.141593e+00 string1 9.876543e+09 NaN
1002 2.800000e+01 string2 0.000000e+00 NaN
1003 -6.180000e-17 string3 3.333333e+02 NaN
1004 1.100000e+00 string4 NaN NaN
它们都有数千行和数百列,并以 CSV 格式存储。 出于存储经济的原因,我想在将数据帧中包含的每个值保存到 csv 之前优化它们的精度。
对于4位的精度,这可能会给出以下结果。
col1 col2 col3 col4
1001 3.141e+00 string1 9.876e+09 NaN
1002 2.8e+01 string2 0e+00 NaN
1003 -6.18e-17 string3 3.333e+02 NaN
1004 1.1e+00 string4 NaN NaN
有时同一列中的范围很大,“舍入”方法不适合我的情况,因为它不允许我在大值和小值之间保持相似的精度。我也用“df.to_csv()”命令测试了“float_format”参数,但它也不符合我的需要。
Python's Decimal library满足了这个需求,但是我没能在dataframe上应用。 您有有效应用此类处理的解决方案吗?
注意: 如果预期值为“1.1e+00”,我也可以接受“1.1”格式,一旦存储在 CSV 中会更经济。但是对于太极端或太接近于零的数字,这种格式可能并不理想......因此科学记数法似乎更适合我。
运行 显示DF之前的这条命令:
pd.options.display.float_format = "{:,.4E}".format
或者,如果您只需要几行,例如:
df['col1'] = df['col1'].map('${:,.4E}'.format)