python - 无法在 Pandas 中将浮点数限制为小数点后两位
问题描述
我有各种各样的数据,如下所示
data1 = [[(271.760309837,)], [(289.247745329,)]]
data2 = [(u'A', datetime.datetime(2019, 8, 23, 0, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 2.66666666666667), (u'B', datetime.datetime(2019, 8, 23, 0, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 3.66666666666667), (u'C', datetime.datetime(2019, 8, 23, 0, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 12.25), (u'D', datetime.datetime(2019, 8, 23, 0, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 5.875), (u'E', datetime.datetime(2019, 8, 23, 0, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 9.06451612903226), (u'F', datetime.datetime(2019, 8, 23, 1, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 5.363636363636), (u'G', datetime.datetime(2019, 8, 23, 1, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 3.5), (u'H', datetime.datetime(2019, 8, 23, 1, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 9.53125), (u'I', datetime.datetime(2019, 8, 23, 1, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 3.2), (u'J', datetime.datetime(2019, 8, 23, 1, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 7.0967741354839), (u'K', datetime.datetime(2019, 8, 23, 2, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 3.25), (u'L', datetime.datetime(2019, 8, 23, 2, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 5.1153846153846), (u'M', datetime.datetime(2019, 8, 23, 2, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 6.387096419355), (u'N', datetime.datetime(2019, 8, 23, 2, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 4.47058529412), (u'O', datetime.datetime(2019, 8, 23, 2, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 3.727272727273), (u'P', datetime.datetime(2019, 8, 23, 3, 0, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)), 5.2)]
data3 = [[('A', 204.593564568), ('B', 217.421341061), ('C', 237.296250326), ('D', 217.464281998), ('E', 206.329901299)], [('F', 210.297625953), ('G', 228.117692718), ('H', 4), ('I', 265.319671257), ('K',)]]
如您所见,浮点值在小数点后有几个数字。我想将任何出现的浮点值设为小数点后一位数。在网上寻找答案,我遇到的最常见的建议是使用该round()
功能。所以我尝试了这个
import pandas as pd
import datetime
import psycopg2
df = pd.DataFrame(data1).round(2).values.tolist()
df = pd.DataFrame(data2).round(2).values.tolist()
df = pd.DataFrame(data3).round(2).values.tolist()
但它只适用data2
于其他两个数据没有显示任何四舍五入的情况。
此外,我还尝试使用numpy
来达到结果
df = pd.Dataframe(data1)
np.round(df, decimals=2).values
df = pd.Dataframe(data2)
np.round(df, decimals=2).values
df = pd.Dataframe(data2)
np.round(df, decimals=2).values
但同样它只适用于data2
. 如何确保在 pandas 中的任何数据格式中舍入或限制为小数点后两位是一致的?
解决方案
问题在于数据格式,有元组而不是标量。所以可能的解决方案是使用DataFrame.applymap
元素明智地应用 lambda 函数 - 可能存在圆形浮点数:
f = lambda x: tuple([round(y, 2) if isinstance(y, float) else y for y in x])
df = pd.DataFrame(data1).applymap(f).values.tolist()
print (df)
[[(271.76,)], [(289.25,)]]
df = pd.DataFrame(data3).applymap(f).values.tolist()
print (df)
[[('A', 204.59), ('B', 217.42), ('C', 237.3), ('D', 217.46),
('E', 206.33)], [('F', 210.3), ('G', 228.12), ('H', 4), ('I', 265.32), ('K',)]]
推荐阅读
- laravel - 每个客户的动态文件夹
- discord.js - 在这种情况下开始给我很多错误
- java - 源代码与 Android 的 View.java 的字节码不匹配
- html - 如何在使用 JSPDF 从 html 页面创建的 PDF 文件中创建多页
- c# - 我需要弄清楚如何使用 facebook api 细分:publisher_platform 参数
- python-3.x - Python 3 将随机亚洲字符附加到文件中,哪种编码是正确的?
- jmeter - 如何在 Jmeter 的 Header 中添加 Token?
- react-native - Action Creator 返回未定义的 axios
- angular - 我正在使用带有 rxjs compact 的 ng2 tostr 并出现以下错误,我该怎么办?
- sql - Informix DB LIKE 查询中的 UPPER 和 LOWER 函数不适用于表中的所有条目