似乎无法缩短我的Pandas列的十进制数

时间:2016-11-30 00:20:59

标签: pandas decimal

所以我有一个df列,我通过平均三个其他列创建

df['Avg_Grade'] = df.loc[:,'G1':'G3'].mean(axis =1)

该系列看起来像这样(只是一个样本)

   Avg_Grade  
0   5.666667  
1   5.333333  
2   8.333333  
3  14.666667  
4   8.666667  

我正在尝试截断输出以显示类似

的内容
 0   5.67 (5.66 is also fine)
 1   5.33  
 2   8.33  
 3   14.67  
 4   8.67

我使用以下代码使用模块Decimal,但是我收到了错误。

from decimal import *
getcontext().prec = 4


df['Avg_Grade'] = Decimal(df.loc[:,'G1':'G3'].mean(axis =1))


 Traceback (most recent call last):
  File "<pyshell#409>", line 1, in <module>
    df['Avg_Grade'] = Decimal(df.loc[:,'G1':'G3'].mean(axis =1))
  File "C:\Python27\lib\decimal.py", line 657, in __new__
    raise TypeError("Cannot convert %r to Decimal" % value)
TypeError: Cannot convert 0       5.666667

1 个答案:

答案 0 :(得分:3)

有几种方法可以做到这一点,但他们在所有情况下都无法工作。

以下是一个示例数据框:

In [1]:
df = pd.DataFrame(10*np.random.rand(4,3), columns=['G1','G2','G3'])
df['Avg_Grade'] = df.loc[:,'G1':'G3'].mean(axis =1)
df

Out [1]:
         G1        G2        G3  Avg_Grade
0  9.843159  4.155922  9.652694   7.883925
1  2.108822  9.347634  9.271351   6.909269
2  2.681108  3.071449  0.387151   2.046569
3  4.017461  9.464408  0.395482   4.625783

<强> 1。使用全局熊猫设置

所有浮点数将以小数点后两位显示。您可以使用以下任一方法:

pd.options.display.precision = 2
pd.set_option('display.precision', 2)

In [3]: df

Out[3]:
     G1    G2    G3  Avg_Grade
0  9.84  4.16  9.65       7.88
1  2.11  9.35  9.27       6.91
2  2.68  3.07  0.39       2.05
3  4.02  9.46  0.40       4.63

<强> 2。在with声明中使用全局设置。

with语句中显示的所有浮点数将显示两位小数,但之后将恢复为常规值(默认值:6)

 In [4]: with pd.option_context('display.precision', 2):
             print(df)
 Out[4]:
     G1    G2    G3  Avg_Grade
0  9.84  4.16  9.65       7.88
1  2.11  9.35  9.27       6.91
2  2.68  3.07  0.39       2.05
3  4.02  9.46  0.40       4.63

一旦你在with声明之外:

In [5]: print(df['Avg_Grade'])
0    7.883925
1    6.909269
2    2.046569
3    4.625783
Name: Avg_Grade, dtype: float64

print(df['Avg_Grade'])

第3。使用HTML样式器。

这需要您在Jupyter Notebook中运行代码。

df.style.set_precision(3)

<强> 4。使用round()

如果您想要展示某些内容,您还可以使用以下内容:

df.round(2)
df['Avg_Grade'].round(2)

<强> 5。创建另一个数据框或就地修改

这种方式可让您按列自定义精度列,但基础数据已更改,因此您可能希望在副本上执行此操作。

# Create a copy so we don't mess up the original df
df_print = df.copy()

# Round down some numbers
df_print['Avg_Grade'] = df_print['Avg_Grade'].round(2)
df_print['G1'] = df_print['Avg_Grade'].round(4)

# Add more decimals: need to switch that to a string representation
df_print['G3'] = df_print['G3'].map(lambda x: "{:,.10f}".format(x))

# display
df_print

     G1        G2            G3  Avg_Grade
0  7.88  4.155922  9.6526935480       7.88
1  6.91  9.347634  9.2713506079       6.91
2  2.05  3.071449  0.3871511232       2.05
3  4.63  9.464408  0.3954815519       4.63