所以我有一个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
答案 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