Python 无法将浮点值限制为小数点后两位

Python 无法将浮点值限制为小数点后两位,python,pandas,numpy,Python,Pandas,Numpy,我有一些不同的数据,如下所示 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=

我有一些不同的数据,如下所示

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中任何数据格式的舍入或限制为小数点后两位是一致的?

问题在于数据格式,存在元组而不是标量。因此,可能的解决方案用于元素应用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',)]]

您的解决方案很棒,但它适用于data1和data3,但不适用于data2。它抛出一个错误。@SouvikRay-是的,它是不同的值,标量。因此,使用solution
df=pd.DataFrame(data2).round(2).values.tolist()
ok cool!我计划将它变成一个函数,并放置一个try-and-catch块来相应地处理场景和用户applymap。感谢您的解决方案。嘿,它似乎不适用于像这样的数据格式
[(“abc”,(“def”,(“ghi”,),(“ijk”,)]
它给出了一个像
[('a','b','c')],[('d','e','f')],[('g','h','i'),[('i','j','k')].
@souvkray-您需要测试数据帧中是否有标量。如果test
data4=[(“abc”,),(“def”,(“ghi”,),(“ijk”,)]df=pd.DataFrame(data4)
get scalar-在
“cell”
中没有元组,没有列表,所以这里有必要使用第二种解决方案。但是,如果数据像
data5=[(“abc”,(“def”,),(“ghi”,),(“ijk”,)]]df=pd.DataFrame(data5)
,就有元组,因为double
[[]
然后工作
applymap
解决方案。