10

使用:

newdf3.pivot_table(rows=['Quradate'],aggfunc=np.mean)

これにより、次の結果が得られます。

           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

10 進数を 2 桁に丸めて 100 を掛けたものを取得したいと思います。これを試した

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')

他の多くのアプローチを試してみましたが、アイテムがフロートではないことに最も不満があります...パンダシリーズオブジェクトにはラウンドメソッドがあることがわかりますが、DFにはありませんdf.applyを使用してみましたが、フロートの問題について不平を言いました。

4

4 に答える 4

8

Pandas 0.17 以降、DataFrame には「ラウンド」メソッドがあります。

df =newdf3.pivot_table(rows=['Quradate'],aggfunc=np.mean)
df.round()

これにより、列ごとに異なる精度を設定することもできます

df.round({'Alabama_exp':2, 'Credit_exp':3})
于 2015-11-12T09:32:28.190 に答える
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

適用できる部分関数を返​​す関数を作成することもできます。

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

In [28]: df.apply(column_round(2))

@EMS が示唆するように、属性を実装し、多くの ufuncを自動的にラップするためnp.round、同様に使用できます。また、上記のフレームでは約 2 倍の速さです。DataFrame__array__numpy

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

数値以外の列がある場合、これを行うことができます:

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)

numpy文字列の列を丸めようとしたときにスローされる不可解なエラーを回避します。

于 2013-09-30T19:01:40.160 に答える
3

OPのアプローチでエラーが発生した理由を説明するために、これをここに残しますが、その後の解決策の方が優れています。

最善の解決策は、単純に Series のround方法を使用することです。

In [11]: s
Out[11]: 
0    0.026574
1    0.304801
2    0.057819
dtype: float64

In [12]: 100*s.round(2)
Out[12]:  
0     3
1    30
2     6
dtype: float64

.astype('int')次に何をしたいかによっては、そこに追加することもできます。

あなたのアプローチがうまくいかなかった理由を理解するには、関数roundには小数点以下の桁数と丸められるデータの 2 つの引数が必要であることを思い出してください。一般に、2 つの引数を取る関数を適用するには、次のように関数を「カリー化」できます。

In [13]: s.apply(lambda x: round(x, 2))
Out[13]: 
0    1.03
1    1.30
2   -1.06
dtype: float64

DSM がコメントで指摘しているように、この場合round、DataFrame のメソッドがないため、実際にはカリー化アプローチが必要です。df.applymap(...)行く方法です。

于 2013-09-30T18:06:35.797 に答える