9

を使用せずに 2 つの列の積 (または合計など) を直接計算することは可能ですか?

grouped.apply(lambda x: (x.a*x.b).sum()

使用する方がはるかに高速です(私のマシンでの時間の半分未満)

df['helper'] = df.a*df.b
grouped= df.groupby(something)
grouped['helper'].sum()
df.drop('helper', axis=1)

しかし、私はこれをしなければならないのはあまり好きではありません。たとえば、グループごとの加重平均を計算すると便利です。ここで、ラムダアプローチは次のようになります

grouped.apply(lambda x: (x.a*x.b).sum()/(df.b).sum())

また、ヘルパーを b.sum() で除算するよりもはるかに遅くなります。

4

3 に答える 3

8

このようなことを行うために、最終的に埋め込み配列式エバリュエーター (ステロイドの Numexpr) を構築したいと考えています。現在、私たちは Python の制限に取り組んでいます。Cython アグリゲーターを実装して(x * y).sum()それを行う場合は、groupby で接続できますが、理想的には Python 式を関数として記述できます。

def weight_sum(x, y):
    return (x * y).sum()

これは「JIT コンパイル」され、groupby(...).sum() とほぼ同じ速度になります。私が説明しているのは、かなり重要な (何ヶ月にもわたる) プロジェクトです。BSD 互換の APL 実装があれば、上記のようなことをもっと早くできるかもしれません (大声で考えただけです)。

于 2012-04-07T20:18:37.160 に答える
0

答えは何年も後にpydata blazeを介して得られました

from blaze import *
data = Data(df)
somethings = odo(
by(data.something, 
   wm = (data.a * data.weights).sum()/data.weights.sum()),
pd.DataFrame)
于 2016-08-02T13:48:44.293 に答える
0

たとえば、xa*xb の結果を直接グループ化するのはどうでしょうか。

from pandas import *
from numpy.random import randn
df = DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
               'foo', 'bar', 'foo', 'foo'],
        'B' : ['one', 'one', 'two', 'three',
               'two', 'two', 'one', 'three'],
        'C' : randn(8), 'D' : randn(8)})

print (df.C*df.D).groupby(df.A).sum()
于 2012-04-07T13:02:28.190 に答える