在Pandas DafaFrame中舍入条目

dar*_*dog 9 python numpy pandas

使用:

newdf3.pivot_table(rows=['Quradate'],aggfunc=np.mean)
Run Code Online (Sandbox Code Playgroud)

产量:

           Alabama_exp  Credit_exp  Inventory_exp   National_exp    Price_exp   Sales_exp
Quradate                        
2010-01-15   0.568003    0.404481    0.488601    0.483097    0.431211    0.570755
2010-04-15   0.543620    0.385417    0.455078    0.468750    0.408203    0.564453
Run Code Online (Sandbox Code Playgroud)

我想把十进制数字四舍五入到两位数乘以100,例如.568003应该是57在摆弄它一段时间无济于事; 试过这个

newdf3.pivot_table(rows=['Quradate'],aggfunc=np.mean).apply(round(2)) #and got:
TypeError: ("'float' object is not callable", u'occurred at index Alabama_exp')
Run Code Online (Sandbox Code Playgroud)

尝试了其他一些方法无济于事,大多数抱怨该项目不是浮点数......我看到Pandas系列对象有一个圆形方法,但DF不尝试使用df.apply但它抱怨浮动问题.

ely*_*ely 18

只需使用numpy.round,例如:

100 * np.round(newdf3.pivot_table(rows=['Quradate'], aggfunc=np.mean), 2) 
Run Code Online (Sandbox Code Playgroud)

只要round适用于所有列类型,这适用于a DataFrame.

有些数据:

In [9]: dfrm
Out[9]:
          A         B         C
0 -1.312700  0.760710  1.044006
1 -0.792521 -0.076913  0.087334
2 -0.557738  0.982031  1.365357
3  1.013947  0.345896 -0.356652
4  1.278278 -0.195477  0.550492
5  0.116599 -0.670163 -1.290245
6 -1.808143 -0.818014  0.713614
7  0.233726  0.634349  0.561103
8  2.344671 -2.331232 -0.759296
9 -1.658047  1.756503 -0.996620

In [10]: 100*np.round(dfrm, 2)
Out[10]:
     A    B    C
0 -131   76  104
1  -79   -8    9
2  -56   98  137
3  101   35  -36
4  128  -20   55
5   12  -67 -129
6 -181  -82   71
7   23   63   56
8  234 -233  -76
9 -166  176 -100
Run Code Online (Sandbox Code Playgroud)


Tic*_*kon 7

自Pandas 0.17以来,DataFrames采用"圆"方法:

df =newdf3.pivot_table(rows=['Quradate'],aggfunc=np.mean)
df.round()
Run Code Online (Sandbox Code Playgroud)

甚至允许您对每列具有不同的精度

df.round({'Alabama_exp':2, 'Credit_exp':3})
Run Code Online (Sandbox Code Playgroud)


Phi*_*oud 5

对于一个中等大小DataFrame,applymap会非常慢,因为它在Python中按元素应用Python函数元素(即,没有Cython加速这一点).它使用apply起来更快functools.partial:

In [22]: from functools import partial

In [23]: df = DataFrame(randn(100000, 20))

In [24]: f = partial(Series.round, decimals=2)

In [25]: timeit df.applymap(lambda x: round(x, 2))
1 loops, best of 3: 2.52 s per loop

In [26]: timeit df.apply(f)
10 loops, best of 3: 33.4 ms per loop
Run Code Online (Sandbox Code Playgroud)

你甚至可以创建一个函数来返回一个可以应用的部分函数:

In [27]: def column_round(decimals):
   ....:     return partial(Series.round, decimals=decimals)
   ....:

In [28]: df.apply(column_round(2))
Run Code Online (Sandbox Code Playgroud)

正如@EMS建议的那样,你也可以使用np.round,因为DataFrame实现了__array__属性并自动包装了许多numpyufunc.它的速度也是上图所示框架速度的两倍:

In [47]: timeit np.round(df, 2)
100 loops, best of 3: 17.4 ms per loop
Run Code Online (Sandbox Code Playgroud)

如果您有非数字列,则可以执行以下操作:

In [12]: df = DataFrame(randn(100000, 20))

In [13]: df['a'] = tm.choice(['a', 'b'], size=len(df))

In [14]: dfnum = df._get_numeric_data()

In [15]: np.round(dfnum)
Run Code Online (Sandbox Code Playgroud)

避免在numpy尝试对字符串列进行舍入时引发的神秘错误.

  • 为什么不使用`numpy.round`并将`DataFrame`作为参数传递?`100*np.round(df,2)`似乎为我解决了这个问题.如果某些列的类型不适合`round`,只需在传递给`round`函数之前将它们排除.这应该避免"类似"应用程序的开销. (2认同)