グループ化、フィルタリング、変更、およびカスタム関数を適用する必要がある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()コールからの出力であるため、しばらくしてから実際にはかなり遅くなります。
"同じ[y]値を持つ1つのグループ内のすべての行を除外します"。どの複製を保持し、どの複製を破棄するか(たとえば、numとyの値は同じですが、場所の値は異なります)を決定するにはどうすればよいですか?同様に、グループ内に6つ以上のグループがある場合は、どのグループを保持するかをどのように決定しますか?この問題をより小さな部分に分割することをお勧めします。 – Alexander