2017-02-23 17 views
6

グループ化、フィルタリング、変更、およびカスタム関数を適用する必要があるdfがあります。私の「通常の」アプローチは、最もエレガントなものではなく、遅くすることです!パンダ:データフレーム全体に複雑な関数を適用する最も効率的な方法

私は[NUM]すなわち上のDFグループに必要
[name] [cnt] [num] [place] [y] 

AAAA  12 20182.0  5.0 1.75 
BBBB  12 20182.0  7.0 2.00 
AAAA  10 20381.0 10.0 9.25 
BBBB  10 20381.0 12.0 18.75 
EEEE  12 21335.0  1.0 0.00 
RRRR  12 21335.0  8.0 3.00 
CCCC  12 21335.0  9.0 3.50 

:私は3つのタスクを実行する必要があり、これらのグループのそれぞれについて

[name] [cnt] [num] [place] [y] 

AAAA  12 20182.0  5.0 1.75 
BBBB  12 20182.0  7.0 2.00 

I.は1内のすべての行をフィルタリング同じ[y]値を持つグループ。グループは最大6つの値で構成できます。

II。 [place]:(5,7)および(7,5)

IIIの長さ2の可能なサブセットをすべて作成します。すべてのサブセットにカスタム関数を適用します。

def func(p1, p2): 

    diff_p = p2-p1 
    if diff_p > 0: 
     return 2/(diff_p * p2) 
    else: 
     return p1/(diff_p * 12) 

ここで、p1 =タプルの最初の場所。 p2 =タプルの2番目の場所。 12は[cnt]列の値です。例えば、グループのために与える:

[name] [cnt] [num] [place] [y] [desired] 

AAAA  12 20182.0  5.0 1.75 0.1428571429 
BBBB  12 20182.0  7.0 2.00 -0.2916666667 

AAAAさん[希望]列には、AAAAの場所値はタプルの最初の部分であるすべてのサブセットの平均のカスタム関数の結果」を保持しています。この例では1つのタプルのみです。

(しかし、のようなグループがAAAAの場所が第1の値である複数のタプルを作成します。これは、最大で6つの値で構成することができます言及した)

私の現在のアプローチは

DFを行うことです。 。GROUPBY( 'NUM')(...)を適用

が行います適用されます。

.drop_

リストの重複(、= Falseの維持 'Y')(、itertools.permutations(df_grp.place.valuesを2))

.meanカスタム関数を適用する()

最初のdfが別の.groupby()。apply()コールからの出力であるため、しばらくしてから実際にはかなり遅くなります。

+0

"同じ[y]値を持つ1つのグループ内のすべての行を除外します"。どの複製を保持し、どの複製を破棄するか(たとえば、numとyの値は同じですが、場所の値は異なります)を決定するにはどうすればよいですか?同様に、グループ内に6つ以上のグループがある場合は、どのグループを保持するかをどのように決定しますか?この問題をより小さな部分に分割することをお勧めします。 – Alexander

答えて

1

お試しくださいGroupBy.aggregate(func, *args, **kwargs)[source] 3つのタスクを集約してください。

関連する問題