2016-11-30 37 views
2

所以,我有我采取其他三列似乎无法缩短我的大熊猫列的十进制数字

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

该系列看起来像这样(只是一个样本的平均创造了DF列)

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

尝试'df.Avg_Grade.round(2)' – piRSquared

+0

感谢这似乎工作! – Moondra

回答

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 
+1

令人惊叹。非常感谢你花时间解释所有的方法。我打算打印出来=) – Moondra

+1

或者你可以将它加入书签并保存一棵树! ;) 请注意,它可能不是“所有的方法”(许多方法在熊猫皮肤猫),但5是一个好开始! –