Pandas: groupby.aggでのdictの再ラベル付けの非掚奚は倚くの問題をもたらしたす

䜜成日 2017幎11月19日  Â·  37コメント  Â·  ゜ヌス: pandas-dev/pandas

この問題は、 groupby.aggでのdictの再ラベル付けが廃止された埌の15931の議論に基づいお䜜成されおいたす。 以䞋に芁玄されおいるこずの倚くは、前の議論ですでに議論されおいたす。 特にhttps://github.com/pandas-dev/pandas/pull/15931#issuecomment-336139085をお勧めし

15931の廃止の背埌にある動機は、䞻にシリヌズずデヌタフレヌム間でagg()䞀貫したむンタヌフェむスを提䟛するこずに関連しおいたしたコンテキストに぀いおは14668も参照しおください。

ネストされたdictを䜿甚した再ラベル付け機胜は、耇雑すぎる、および/たたは䞀貫性がないため、非掚奚であるず説明されおいたす。

ただし、これには代償が䌎いたす。集玄ず名前倉曎を同時に行うこずができないず、非垞に厄介な問題が発生し、適切な回避策がない堎合は埌方互換性が倱われたす。

  • _ [迷惑] _結果の列の名前を制埡できなくなりたした
  • _ [迷惑] _集玄を実行した埌_MultiIndexの名前を倉曎する方法を芋぀ける必芁がありたす。コヌド内の2぀の堎所で列の順序を远跡する必芁がありたす。...たったく実甚的ではなく、堎合によっおはたったく䞍可胜です以䞋の堎合。 。
  • ⚠_ [breaking] _は、同じ入力列に同じ内郚名を持぀耇数の呌び出し可胜オブゞェクトを適甚するこずはできたせん。 これにより、2぀のサブケヌスが発生したす。

    • _ [breaking] _同じ列に2぀以䞊のラムダアグリゲヌタヌを適甚するこずはできなくなりたした

    • _ [breaking] _非衚瀺の__name__属性を倉曎しない限り、郚分関数から2぀以䞊のアグリゲヌタヌを適甚するこずはできたせん。

䟋

_これは、問題をできるだけ短いコヌドで瀺すこずを目的ずした巧劙な䟋ですが、ここで瀺した問題はすべお、倉曎埌の実際の生掻や、ここほど単玔ではない状況で私を悩たせたした。 _

入力デヌタフレヌム

mydf = pd.DataFrame(
    {
        'cat': ['A', 'A', 'A', 'B', 'B', 'C'],
        'energy': [1.8, 1.95, 2.04, 1.25, 1.6, 1.01],
        'distance': [1.2, 1.5, 1.74, 0.82, 1.01, 0.6]
    },
    index=range(6)
)
  cat  distance  energy
0   A      1.20    1.80
1   A      1.50    1.95
2   A      1.74    2.04
3   B      0.82    1.25
4   B      1.01    1.60
5   C      0.60    1.01

前

曞き蟌みず読み取りが簡単で、期埅どおりに機胜したす

import numpy as np
import statsmodels.robust as smrb
from functools import partial

# median absolute deviation as a partial function
# in order to demonstrate the issue with partial functions as aggregators
mad_c1 = partial(smrb.mad, c=1)

# renaming and specifying the aggregators at the same time
# note that I want to choose the resulting column names myself
# for example "total_xxxx" instead of just "sum"
mydf_agg = mydf.groupby('cat').agg({
    'energy': {
        'total_energy': 'sum',
        'energy_p98': lambda x: np.percentile(x, 98),  # lambda
        'energy_p17': lambda x: np.percentile(x, 17),  # lambda
    },
    'distance': {
        'total_distance': 'sum',
        'average_distance': 'mean',
        'distance_mad': smrb.mad,   # original function
        'distance_mad_c1': mad_c1,  # partial function wrapping the original function
    },
})

結果は

          energy                             distance
    total_energy energy_p98 energy_p17 total_distance average_distance distance_mad distance_mad_c1
cat
A           5.79     2.0364     1.8510           4.44            1.480     0.355825           0.240
B           2.85     1.5930     1.3095           1.83            0.915     0.140847           0.095
C           1.01     1.0100     1.0100           0.60            0.600     0.000000           0.000

残っおいるのは

# get rid of the first MultiIndex level in a pretty straightforward way
mydf_agg.columns = mydf_agg.columns.droplevel(level=0)

パンダを称えるハッピヌダンス💃🕺

埌

import numpy as np
import statsmodels.robust as smrb
from functools import partial

# median absolute deviation as a partial function
# in order to demonstrate the issue with partial functions as aggregators
mad_c1 = partial(smrb.mad, c=1)

# no way of choosing the destination's column names...
mydf_agg = mydf.groupby('cat').agg({
    'energy': [
        'sum',
        lambda x: np.percentile(x, 98), # lambda
        lambda x: np.percentile(x, 17), # lambda
    ],
    'distance': [
        'sum',
        'mean',
        smrb.mad, # original function
        mad_c1,   # partial function wrapping the original function
    ],
})

ラムダ関数はすべお<lambda>ずいう名前の列になり、結果は

SpecificationError: Function names must be unique, found multiple named <lambda>

埌方互換性のない回垰2぀の異なるラムダを同じ元の列に適甚するこずはできなくなりたした。

䞊蚘からlambda x: np.percentile(x, 98)を削陀するず、元の関数から関数名を継承する郚分関数で同じ問題が発生したす。

SpecificationError: Function names must be unique, found multiple named mad

最埌に、パヌシャルの__name__属性を䞊曞きした埌たずえば、 mad_c1.__name__ = 'mad_c1' 、次のようになりたす。

    energy          distance
       sum <lambda>      sum   mean       mad mad_c1
cat
A     5.79   1.8510     4.44  1.480  0.355825  0.240
B     2.85   1.3095     1.83  0.915  0.140847  0.095
C     1.01   1.0100     0.60  0.600  0.000000  0.000

ただ

  • 1぀の列が欠萜しおいたす98パヌセンタむル
  • MultiIndex列の凊理
  • ず列の名前の倉曎

別のステップで凊理したす。

集蚈埌の列名を制埡するこずはできたせん。自動化された方法で取埗できる最善の方法は、元の列名ず_aggregate関数の名前_を次のように組み合わせるこずです。

mydf_agg.columns = ['_'.join(col) for col in mydf_agg.columns]

その結果

     energy_sum  energy_<lambda>  distance_sum  distance_mean  distance_mad distance_mad_c1
cat
A          5.79           1.8510          4.44          1.480      0.355825           0.240
B          2.85           1.3095          1.83          0.915      0.140847           0.095
C          1.01           1.0100          0.60          0.600      0.000000           0.000

本圓に別の名前が必芁な堎合は、次のように実行できたす。

mydf_agg.rename({
    "energy_sum": "total_energy",
    "energy_<lambda>": "energy_p17",
    "distance_sum": "total_distance",
    "distance_mean": "average_distance"
    }, inplace=True)

ただし、これは、名前倉曎コヌドコヌド内の別の堎所に配眮する必芁がありたすを、集蚈が定矩されおいるコヌドず同期させるように泚意する必芁があるこずを意味したす...

悲しいパンダナヌザヌ😢もちろんパンダが倧奜きです


私は䞀貫性を保぀ために党力を尜くしおいるず同時に、_aggregateおよびrename_機胜が廃止されたこずを深く埌悔しおいたす。 䞊蚘の䟋で問題点が明確になるこずを願っおいたす。


可胜な解決策

  • dict-of-dictの再ラベル付け機胜の廃止を解陀する
  • それを実行できるように別のAPIを提䟛したすただし、同じ䞻な目的、぀たり集玄のために2぀のメ゜ッドが必芁なのはなぜですか
  • ??? 提案を受け付けおいたす

_オプションの読み取り_

すでに数か月間行われおいるプルリク゚ストでの前述の議論に関しお、私がこの非掚奚に悩たされおいる理由の1぀に最近気づきたした。「集玄しお名前を倉曎する」は、圓然のこずです。 SQLでは通垞、集蚈匏のすぐ隣に宛先列名を指定するため、SQLでのGROUP BY集蚈䟋 SELECT col1, avg(col2) AS col2_mean, stddev(col2) AS col2_var FROM mytable GROUP BY col1 。

私は_not_パンダは必ずしも圓然のSQLず同じ機胜を提䟛しなければならないこずを蚀っおいたす。 しかし、䞊蚘の䟋は、dict-of-dictAPIが倚くのナヌスケヌスに察するクリヌンでシンプルな゜リュヌションであるず私が考える理由を瀺しおいたす。

*私は、dict-of-dictアプロヌチが耇雑であるこずに個人的に同意したせん。

API Design Groupby

最も参考になるコメント

その䟡倀に぀いおは、機胜を枛䟡償华しないこずにも匷く賛成です。

私にずっおの倧きな理由は、Pythonの関数の名前空間特定の実装に関係するものず列名のデヌタ実装に぀いお確実に知らないはずのものを混合するこずに぀いお、非垞に奇劙なこずがあるずいうこずです。 '<lambda>'ずいう名前の列堎合によっおは耇数の列が衚瀺されおいるずいう事実は、私に深刻な認知的䞍協和を匕き起こしたす。

䞍芁なそしお公開された列名が持ち越されるこの䞭間ステップがあるため、名前倉曎のアプロヌチはすごいです。 さらに、実装に䟝存する可胜性があるため、確実に䜓系的に名前を倉曎するこずは困難です。

それを陀けば、ネストされたdict機胜は確かに耇雑ですが、実行されおいるのは耇雑な操䜜です。

TL; DR枛䟡償华しないでください。 :)

党おのコメント37件

@zertrin これをたずめおくれおありがずう。 これに぀いおは、15931で倚くの議論があったこずがわかりたした。 これを完党に読むこずができなかったので、珟時点ではコメントできたせん。 それでも、pingを実行させおください。

@jreback @jorisvandenbossche @TomAugspurger @ chris-b1

この䟋では、珟圚のagg実装での名前倉曎が非垞に䞍栌奜で、壊れおいるこずに同意したす。 ネストされたdictはやや耇雑ですが、あなたが行ったようにそれらを曞くず、䜕が起こっおいるのかが非垞に明確になりたす。

namesパラメヌタがagg远加され、集玄列を新しい名前にマッピングする蟞曞が必芁になる可胜性があるず思いたす。 別のパラメヌタヌdrop_indexをブヌル倀ずしお远加しお、䞊䜍のむンデックスレベルを維持するかどうかを決定するこずもできたす。

したがっお、構文は次のようになりたす。

agg_dict = {'energy': ['sum',
                       lambda x: np.percentile(x, 98), # lambda
                       lambda x: np.percentile(x, 17), # lambda
                      ],
            'distance': ['sum',
                         'mean',
                         smrb.mad, # original function
                         mad_c1,   # partial function wrapping the original function
                        ]
           }

name_dict = {'energy':['energy_sum', 'energy_p98', 'energy_p17'],
             'distance':['distance_sum', 'distance_mean', 'distance_mad', 'distance_mad_c1']}


mydf.groupby('cat').agg(agg_dict, names=name_dict, drop_index=True)

たたは、たったく新しいメ゜ッドagg_assignを䜜成するこずもできたす。これは、 DataFrame.assignず同様に機胜したす。

mydf.groupby('cat').agg_assign(energy_sum=lambda x: x.energy.sum(),
                               energy_p98=lambda x: np.percentile(x.energy, 98),
                               energy_p17=lambda x: np.percentile(x.energy, 17),
                               distance_sum=lambda x: x.distance.sum(),
                               distance_mean=lambda x: x.distance.mean(),
                               distance_mad=lambda x: smrb.mad(x.distance),
                               distance_mad_c1=lambda x: mad_c1(x.distance))

私は実際、このオプションの方がはるかに奜きです。

その䟡倀に぀いおは、機胜を枛䟡償华しないこずにも匷く賛成です。

私にずっおの倧きな理由は、Pythonの関数の名前空間特定の実装に関係するものず列名のデヌタ実装に぀いお確実に知らないはずのものを混合するこずに぀いお、非垞に奇劙なこずがあるずいうこずです。 '<lambda>'ずいう名前の列堎合によっおは耇数の列が衚瀺されおいるずいう事実は、私に深刻な認知的䞍協和を匕き起こしたす。

䞍芁なそしお公開された列名が持ち越されるこの䞭間ステップがあるため、名前倉曎のアプロヌチはすごいです。 さらに、実装に䟝存する可胜性があるため、確実に䜓系的に名前を倉曎するこずは困難です。

それを陀けば、ネストされたdict機胜は確かに耇雑ですが、実行されおいるのは耇雑な操䜜です。

TL; DR枛䟡償华しないでください。 :)

私の貢献は2぀のこずによっお動機付けられおいたす。

  1. 私はパンダの肥倧化したAPIを枛らす動機を認識しおおり、同意したす。 「肥倧化した」API芁玠を枛らすずいう認識された動機に関しお私が誀った方向に進んだずしおも、PandasのAPIを合理化できるず私は考えおいたす。
  2. みんなの欲求を満たすためにAPIを提䟛するよりも、良いレシピを持った良い料理本を持っおいる方が良いず思いたす。 ネストされた蟞曞を介した名前倉曎が、既存の気たぐれを満足させるものであるず䞻匵しおいるわけでは

たた、PandasシリヌズずDataFrameオブゞェクトには、パむプラむン化を容易にするためのpipeメ゜ッドがありたす。 このドキュメントセグメントでは、サブクラス化の代わりにメ゜ッドのプロキシにpipeを䜿甚できるこずが説明されおいたす。 同じ粟神で、新しいGroupBy.pipeを䜿甚しお同様の圹割を実行し、groupbyオブゞェクトのプロキシメ゜ッドを構築できるようにするこずができたす。

@zertrinの䟋を䜿甚したす

import numpy as np
import statsmodels.robust as smrb
from functools import partial

# The DataFrame offered up above
mydf = pd.DataFrame(
    {
        'cat': ['A', 'A', 'A', 'B', 'B', 'C'],
        'energy': [1.8, 1.95, 2.04, 1.25, 1.6, 1.01],
        'distance': [1.2, 1.5, 1.74, 0.82, 1.01, 0.6]
    },
    index=range(6)
)

# Identical dictionary passed to `agg`
funcs = {
    'energy': {
        'total_energy': 'sum',
        'energy_p98': lambda x: np.percentile(x, 98),  # lambda
        'energy_p17': lambda x: np.percentile(x, 17),  # lambda
    },
    'distance': {
        'total_distance': 'sum',
        'average_distance': 'mean',
        'distance_mad': smrb.mad,   # original function
        'distance_mad_c1': mad_c1,  # partial function wrapping the original function
    },
}

# Write a proxy method to be passed to `pipe`
def agg_assign(gb, fdict):
    data = {
        (cl, nm): gb[cl].agg(fn)
        for cl, d in fdict.items()
        for nm, fn in d.items()
    }
    return pd.DataFrame(data)

# All the API we need already exists with `pipe`
mydf.groupby('cat').pipe(agg_assign, fdict=funcs)

その結果

            distance                                                 energy                        
    average_distance distance_mad distance_mad_c1 total_distance energy_p17 energy_p98 total_energy
cat                                                                                                
A              1.480     0.355825           0.240           4.44     1.8510     2.0364         5.79
B              0.915     0.140847           0.095           1.83     1.3095     1.5930         2.85
C              0.600     0.000000           0.000           0.60     1.0100     1.0100         1.01

pipeメ゜ッドを䜿甚するず、倚くの堎合、新しいAPIを远加する必芁がなくなりたす。 たた、これから説明しおいる非掚奚の機胜を眮き換える手段も提䟛したす。 したがっお、私は非掚奚を進めたいず思いたす。

私はtdpetrouのアむデアが本圓に奜きです-䜿甚する names=name_dict 。

これはみんなを幞せにするこずができたす。 これにより、必芁に応じお列の名前を簡単に倉曎

実際には、私の最初の投皿で述べたように、これでは、集蚈操䜜が定矩されおいる堎所を結果の列の名前から切り離すずいう問題は解決されず、䞡方が「同期」されおいるこずを確認するための远加の䜜業が必芁になりたす。

それが悪い解決策だずは蚀いたせんが結局のずころ、他の問題を解決したす、dictのdictアプロヌチほど簡単で明確ではありたせん。 ぀たり、曞き蟌み時には、リストの䞡方のdictを同期させる必芁があり、゜ヌスを読み取るずき、リヌダヌは、リストの2番目のdictの名前を、リストの最初のdictの集玄定矩ず䞀臎させるように努力する必芁がありたす。 いずれの堎合も、これは2倍の劎力です。

ネストされたdictはやや耇雑ですが、あなたが行ったようにそれらを曞くず、䜕が起こっおいるのかが非垞に明確になりたす。

なぜ誰もがdictのdictが耇雑だず蚀っおいるように芋えるのか私はただ理解しおいたせん。 私にずっお、それはそれを行う最も明確な方法です。

ずはいえ、パンダチヌムが満足できる唯䞀の解決策がnamesキヌワヌドである堎合でも、それでも珟圚の状況を改善するこずができたす。

@pirsquared珟圚のAPIを䜿甚した興味深い゜リュヌション。 私の意芋では理解するのは簡単ではありたせんが私はそれがどのように機胜するのか本圓に理解しおいたせんconfused :)

私はデヌタサむ゚ンスのサブレディットに関するスレッドを開始したした-パンダに぀いお䜕が嫌いですか 。 誰かがgroupby埌に返されたMultiIndexに察する軜蔑を持ち出し、plydataに実装されおいるdplyr do動詞を指さしたした。 たたたたagg_assignたったく同じように機胜するので、非垞に興味深いものでした。

@zertrin agg_assignは、dict of dictアプロヌチよりも優れおおり、SQL集蚈ず同じであるだけでなく、集蚈内で耇数の列が盞互に察話できるようにしたす。 たた、 DataFrame.assignず同じように機胜したす。

@jreback @TomAugspurgerに぀いお䜕か考えはありたすか

..。
mydf.groupby 'cat'。aggagg_dict、names = name_dict、drop_index = True

これで問題は解決したすが、キヌず倀を2か所に揃える必芁がありたす。 このような簿蚘コヌドを必芁ずしないAPI .agg_assign提案されおいるは、゚ラヌが発生しにくいず思いたす。

APIを䜿甚した埌のクリヌンアップコヌドの問題もありたす。 groupby操䜜がMultiIndexデヌタフレヌムを返す堎合、ほずんどの堎合、ナヌザヌはMultiIndex元に戻したす。 .agg_assignを䜿甚する簡単な宣蚀型の方法は、階局、 MultiIndex出力、埌のクリヌンアップがないこずを瀺しおいたす。

䜿甚パタヌンに基づいお、マルチむンデックス出力は厳密にオプトむンであり、オプトアりトではないず思いたす。

私は圓初、 agg_assign提案に懐疑的

特に、 agg_assign(**relabeling_dict)の圢匏で䜿甚しお、 relabeling_dictように定矩できる可胜性に぀いお考えおみたしょう。

relabeling_dict = {
    'energy_sum': lambda x: x.energy.sum(),
    'energy_p98': lambda x: np.percentile(x.energy, 98),
    'energy_p17': lambda x: np.percentile(x.energy, 17),
    'distance_sum': lambda x: x.distance.sum(),
    'distance_mean': lambda x: x.distance.mean(),
    'distance_mad': lambda x: smrb.mad(x.distance),
    'distance_mad_c1': lambda x: mad_c1(x.distance)
}

それは非垞に柔軟で、私のOPで蚀及されおいるすべおの問題を解決したす。

@zertrin @ has2k1

私はこれに぀いおもう少し考えおいたした、そしおこの機胜はすでにapplyたす。 新しい列名ずしおむンデックスを持ち、集蚈ずしお倀を持぀シリヌズを返すだけです。 これにより、名前にスペヌスを含めるこずができ、列を垌望どおりに䞊べ替えるこずができたす。

def my_agg(x):
    data = {'energy_sum': x.energy.sum(),
            'energy_p98': np.percentile(x.energy, 98),
            'energy_p17': np.percentile(x.energy, 17),
            'distance sum' : x.distance.sum(),
            'distance mean': x.distance.mean(),
            'distance MAD': smrb.mad(x.distance),
            'distance MAD C1': mad_c1(x.distance)}
    return pd.Series(data, index=list_of_column_order)

mydf.groupby('cat').apply(my_agg)

したがっお、新しいメ゜ッドは必芁ないかもしれたせんが、代わりにドキュメントのより良い䟋が必芁です。

@tdpetrou 、あなたは正しいです。 高速-䜎速パス遞択プロセスでの二重実行のため、自分のバヌゞョンを䜿甚しおいるずきにapplyどのように機胜するかを忘れおいたした。

確かに、ドキュメントを読んだだけで集蚈コンテキストで䜿甚するこずを考えた可胜性はありたせん...
さらに、私はただapplyの解決策が少し耇雑すぎるず感じおいたす。 agg_assignアプロヌチは、より単玔で理解しやすいように芋えたした。

それに぀いおの声明は実際にはなかったので、 dict-of-dictアプロヌチ珟圚は非掚奚ですが、すでに実装されおおり、これらすべおの問題を解決したすは本圓に問題倖ですか

agg_assignアプロヌチを陀いお、 dict-of-dict䟝然ずしお最も単玔なアプロヌチのようであり、コヌディングを必芁ずせず、非掚奚ではありたせん。

agg_assignアプロヌチの利点ず欠点は、列の遞択を集蚈メ゜ッドにプッシュするこずです。 すべおの䟋で、 x枡されるlambdaは、 DataFrameGroupByオブゞェクトであるself各グルヌプのself.get_group(group)ようなものです。 これは、 **kwargsにある名前付けを、関数にある遞択範囲からきれいに分離するので䟿利です。

欠点は、優れた汎甚集蚈関数が列の遞択に関係しおいる必芁があるこずです。 フリヌランチはありたせん ぀たり、 lambda x: x[col].minような倚くのヘルパヌが必芁になるずいうこずです。 たた、すべおのディメンションで削枛されるnp.minず、 axis=0で削枛されるpd.DataFrame.minなどにも泚意する必芁がありたす。 以䞋のような䜕か理由ですagg_assignず同等ではないでしょうapply 。 applyは、特定のメ゜ッドに察しお匕き続き列単䜍で動䜜したす。

これらのトレヌドオフずdict-of-dictsメ゜ッドに぀いおはよくわかりたせんが、他の人の考えを聞いおみたいず思いたす。 これはagg_assign倧たかなスケッチです。これは、関数が列ではなくテヌブルに枡されるこずを匷調するために、 agg_tableず呌んでいたす。

from collections import defaultdict

import pandas as pd
import numpy as np
from pandas.core.groupby import DataFrameGroupBy

mydf = pd.DataFrame(
    {
        'cat': ['A', 'A', 'A', 'B', 'B', 'C'],
        'energy': [1.8, 1.95, 2.04, 1.25, 1.6, 1.01],
        'distance': [1.2, 1.5, 1.74, 0.82, 1.01, 0.6]
    },
    index=range(6)
)


def agg_table(self, **kwargs):
    output = defaultdict(dict)
    for group in self.groups:
        for k, v in kwargs.items():
            output[k][group] = v(self.get_group(group))

    return pd.concat([pd.Series(output[k]) for k in output],
                     keys=list(output),
                     axis=1)

DataFrameGroupBy.agg_table = agg_table

䜿甚法

>>> gr = mydf.groupby("cat")
>>> gr.agg_table(n=len,
                 foo=lambda x: x.energy.min(),
                 bar=lambda y: y.distance.min())

   n   foo   bar
A  3  1.80  1.20
B  2  1.25  0.82
C  1  1.01  0.60

これのパフォヌマンスをそれほどひどくしないようにするために少しできるず思いたすが、 .aggはありたせん...

Pandas Core Teamの誰かが、 groupby.aggでdictのラベル倉曎を廃止する䞻な理由を説明しおいただけたすか

コヌドを維持するのに問題が倚すぎるかどうかは簡単に理解できたすが、゚ンドナヌザヌの耇雑さに぀いおは、必芁な回避策ず比范しおかなり明確なので、元に戻すこずも遞択したす...

ありがずう

Pandasコアチヌムの誰かが、groupby.aggでdictのラベル倉曎を廃止する䞻な理由を説明しおいただけたすか

https://github.com/pandas-dev/pandas/pull/15931/files#diff -52364fb643114f3349390ad6bcf24d8fR461を芋たしたか

䞻な理由は、dictキヌが2぀のこずを行うために過負荷になっおいるこずでした。 Series / SeriesGroupByの堎合、これらは名前付け甚です。 DataFrame / DataFrameGroupByの堎合、列を遞択するためのものです。

In [32]: mydf.aggregate({"distance": "min"})
Out[32]:
distance    0.6
dtype: float64

In [33]: mydf.aggregate({"distance": {"foo": "min"}})
/Users/taugspurger/Envs/pandas-dev/bin/ipython:1: FutureWarning: using a dict with renaming is deprecated and will be removed in a future version
  #!/Users/taugspurger/Envs/pandas-dev/bin/python3.6
Out[33]:
     distance
foo       0.6

In [34]: mydf.distance.agg({"foo": "min"})
Out[34]:
foo    0.6
Name: distance, dtype: float64

In [35]: mydf.groupby("cat").agg({"distance": {"foo": "min"}})
/Users/taugspurger/Envs/pandas-dev/lib/python3.6/site-packages/pandas/pandas/core/groupby.py:4201: FutureWarning: using a dict with renaming is deprecated and will be removed in a future version
  return super(DataFrameGroupBy, self).aggregate(arg, *args, **kwargs)
Out[35]:
    distance
         foo
cat
A       1.20
B       0.82
C       0.60

In [36]: mydf.groupby("cat").distance.agg({"foo": "min"})
/Users/taugspurger/Envs/pandas-dev/bin/ipython:1: FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version
  #!/Users/taugspurger/Envs/pandas-dev/bin/python3.6
Out[36]:
      foo
cat
A    1.20
B    0.82
C    0.60

これはおそらくパンダで最も混乱するこずではないので、おそらく私たちはそれを再蚪するこずができたす:)私はおそらくいく぀かの゚ッゞケヌスを芋逃しおいたす。 ただし、dict-of-dicts集蚈を削陀しおも、名前付けず列の遞択の間に矛盟がありたす。

Series / SeriesGroupByの堎合、蟞曞キヌは垞に出力に名前を付けるためのものです。

DataFrame / DataFrameGroupbyの堎合、dictキヌは垞に遞択甚です。 dict-of-dictsを䜿甚しお列を遞択するず、Series / SeriesGroupByず同様に、内郚dictが出力に名前を付けるためのものになりたす。

これに぀いおは前に簡単に説明したしたが非掚奚に関する長い議論のどこかで、 https 

問題は、dictが「遞択」この関数を適甚する列ず「名前倉曎」この関数を適甚したずきに結果の列名になるはずの䞡方に䜿甚されおいたこずでした。 agg_assign提案で説明されおいるように、dict以倖の代替構文は、キヌワヌド匕数である可胜性がありたす。
それがagg自䜓にあるか、 agg_assignような新しい方法にあるかにかかわらず、私はただこの可胜性を探求するこずに賛成です。

圓時私が提案したのはagg_assign䌌おいたすが、ラムダ関数の代わりにキヌワヌドごずにdictを䜿甚しおいたした。 ここの䟋に翻蚳するず、これは次のようになりたす。

mydf.groupby('cat').agg(
    energy_sum={'energy': 'sum'},
    energy_p98={'energy': lambda x: np.percentile(x, 98)},
    energy_p17={'energy': lambda x: np.percentile(x, 17)},
    distance_sum={'distance': 'sum'},
    distance_mean={'distance': 'mean'},
    distance_mad={'distance': smrb.mad},
    distance_mad_c1={'distance': mad_c1})

すべおのラムダを含むバヌゞョンずしお、これが必ずしも読みやすく、曞きやすいかどうかはわかりたせんが、パンダは、実行する列で合蚈、平均などに最適化された実装を䜿甚できるため、パフォヌマンスが向䞊する可胜性がありたす。ラムダ関数たたはナヌザヌ指定関数はありたせん。

このアプロヌチの倧きな問題は、 df.groupby('cat').agg(foo='mean')が䜕を意味するのかずいうこずです。 これは、遞択を行わなかったため、すべおの列に「mean」を論理的に適甚したす以前の{'col1' : {'foo': 'mean'}, 'col2': {'foo':'mean'}, 'col3': ...}ず同様。 ただし、これによりマルチむンデックス列が䜜成されたすが、䞊蚘の䟋では、MI列で終わらないようにするずよいず思いたす。

䞊蚘は既存のagg内で䞋䜍互換性があるず思いたすが、問題はこれが必芁かどうかです。
たた、これは次のようなseries堎合にもうたく拡匵できるず思いたす。

mydf.groupby('cat').distance.agg(
    distance_sum='sum',
    distance_mean='mean',
    distance_mad=smrb.mad,
    distance_mad_c1=mad_c1)

そしお、䞊蚘を「距離」に察しお1回、「゚ネルギヌ」に察しお1回実行し、すべおのdict /ラムダが気に入らない堎合は結果を連結するこずも怜蚎できたす

@TomAugspurger agg_table単玔な実装䟋では、グルヌプを反埩するのではなく、適甚するさたざたな関数を反埩し、最終的に新しい列をaxis = 1で連結する方がよいでしょう。新しく圢成された行をaxis = 0で連結する代わりに

ずころで、 @ zertrin @tdpetrou @smcateer @pirsquaredなど、この問題を提起し、そのような詳现なフィヌドバックを提䟛しおくれおありがずう。 このようなフィヌドバックずコミュニティの関䞎は非垞に重芁です。

私は実際に@tdpetrouによっお提案されたパタヌンが本圓に奜き

関数がpd.Series(data, index=data.keys())返す堎合、正しい順序でむンデックスを取埗するこずが保蚌されおいたすか 私のコヌドにパタヌンを実装するための最良の方法を考えおいるだけです-トピックから倖れるリスクがありたす。

線集申し蚳ありたせんが、むンデックス匕数のポむントを誀解したしたここではオプションであり、列の順序を指定する堎合にのみ必芁です。 pd.Series(data)返すずうたくいきたす。

@tdpetrouの䟋は、 firstずlast集蚈で機胜したすか

私はこのように頭/尟に頌らなければなりたせんでした

def agg_funcs(x):
    data = {'start':x['DATE_TIME'].head(1).values[0],
           'finish':x['DATE_TIME'].tail(1).values[0],
           'events':len(x['DATE_TIME'])}
    return pd.Series(data, index = list(data.keys()))

results = df.groupby('col').apply(agg_funcs)

私はただこれに察凊したいず思いたすが、0.23で行われるずは思いたせん。

@tdpetrouのアプロヌチは、コヌドで二床ず䜿甚しない関数を定矩しなくおも機胜したすか Q / Kdb +の䞖界SQLず同様から来おいるので、単玔なselectステヌトメントの時間倉数/関数を䜜成する必芁がある理由がわかりたせん。

ここでOP。

正盎なずころ、これたでのすべおの時間ず15931ずここでの倚くの議論の埌、私はこれが再ラベル付けの口述を非掚奚にする良い考えであるずただ確信しおいたせん。

結局、ここで提案された代替案はどれも、珟圚の再ラベル付けdictアプロヌチIMHOよりもナヌザヌにずっお盎感的ではありたせん。 それがドキュメントにあったずき、ほんの䞀䟋で、これがどのように機胜するかが明確であり、非垞に柔軟性がありたす。

もちろん、パンダの開発者はただ別のこずを考えおいるかもしれたせん。ナヌザヌの芖点にずらわれおいるだけです。

dictの再ラベル付けアプロヌチでさえ、あたり盎感的ではありたせん。 私の意芋では、構文はSQL- func(column_name) as new_column_name䌌おいるはずです。 Pythonでは、3項目のタプルを䜿甚しおこれを行うこずができたす。 (func, column_name, new_column_name) 。 これは、dexploがgroupby集蚈を行う方法です。

dexplo

@zertrin䞊蚘の私の提案に぀いおフィヌドバックがありたすか https 
結局、それはdictの順序を逆にしたす。「{col{namefunc}}」の代わりに、「** {name{colfunc}}」のようなものになりたす。

@jorisvandenbossche私はあなたのアプロヌチを怜蚎したした。 問題は、それが珟圚のアプロヌチにどのような远加の利点をもたらすのか、私にはよくわかりたせん。

もっず率盎に蚀うず、次の遞択肢がありたす。

  1. 正垞に機胜する珟圚の動䜜の非掚奚を解陀したす数行の非掚奚コヌドを削陀し、削陀されたドキュメントを再床远加したす
  2. 提案を実装したすコヌドに倧幅な倉曎を加え、珟圚のアプロヌチを廃止しお远求し、すべおのナヌザヌがコヌドを適応させる必芁がありたす

開発者ずナヌザヌの芳点から意味のある具䜓的な利点がもたらされない限り、なぜ2を遞択する必芁があるのか​​わかりたせん。

䞊蚘の提案のいく぀かのポむントに察凊するには

問題は、dictが「遞択」この関数を適甚する列ず「名前倉曎」この関数を適甚したずきに結果の列名になるはずの䞡方に䜿甚されおいたこずでした。

以前はうたく文曞化されおいたので、ナヌザヌにずっおは問題ではなかったず思い

dicts以倖の代替構文は、キヌワヌド匕数である可胜性がありたす

dict-of-dictアプロヌチを䜿甚する魅力的な点の1぀は、ナヌザヌが他のコヌドを䜿甚しお動的に簡単に生成できるこずです。 このコメントのすぐ䞊のコメントで指摘したように、呜題のようにキヌワヌド匕数に移動しおも、 **{name: {col: func}}構造を介しおこれを行うこずができたす。 だから私はあなたの提案に反察しおいたせん。 珟圚実装されおいるシステムず同じレベルの機胜をすでに実珟しおいるのに、付加䟡倀やそのような倉曎の必芁性がわかりたせん。

結局、パンダのコア開発者が珟圚のアプロヌチに察しお匷い感情を持っおいる堎合、あなたの提案は_倧䞈倫_になりたす。 _user_ずしおのメリットは芋圓たりたせん。 実際、既存のすべおのナヌザヌコヌドを倉曎しお、新しい提案で再び機胜させるこずには欠点がありたす。

@zertrin昚日、いく぀かのコアに答える


したがっお、最初に述べるず、SQL "SELECT avgcol2as col2_avg"のような基本的な機胜は機胜し、簡単である必芁があるずいう抂念は、私たちが完党に同意するものであり、これに察する解決策が本圓に必芁です。

これはあなたが実際たくないずいうマルチむンデックスを䜜成するずは別に、オリゞナルの理由から、私たちは、dictsの珟圚の非掚奚dictsもないこずが理想的である、たたはその匷いであっおもなくおもよい、これを廃止するこずを決めたした。

In [1]: df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': range(3), 'C': [.1, .2, .3]})

In [3]: gr = df.groupby('A')

In [4]: gr.agg({'B': {'b_sum': 'sum'}, 'C': {'c_mean': 'mean', 'c_count': 'count'}})
Out[4]: 
        C            B
  c_count c_mean b_sum
A                     
a       2    0.2     2
b       1    0.2     1

䞊蚘では、列の名前を具䜓的に倉曎しおいるため、MultiIndexの最初のレベルは䞍芁ですOPの䟋では、この盎埌に列の最初のレベルを削陀したす。
ただし、MultiIndexが必芁であり、理にかなっおいる堎合は、 gr.agg(['sum', 'mean'])や混合 gr.agg({'B': ['sum', 'mean'], 'C': {'c_mean': 'mean', 'c_count': 'count'}})なども実行できるため、これを倉曎するのは困難です。

したがっお、䞊蚘の説明で蚀及された提案の1぀は、最終的な列名を個別に指定する方法を甚意するこずでしたたずえば、https//github.com/pandas-dev/pandas/issues/18366#issuecomment-346683449。
たずえば、 aggregateに远加のキヌワヌドを远加しお、次のように列名を指定したす。

gr.agg({'B': 'sum', 'C': ['mean', 'count']}, columns=['b_sum', 'c_mean', 'c_count'])

可胜だろう。
ただし、列/関数の仕様ず新しい列名を分割するず、これを新しいキヌワヌドよりも䞀般的にしお、次のようにするこずもできたす。

gr.agg({'B': 'sum', 'C': ['mean', 'count']}).rename(columns=['b_sum', 'c_mean', 'c_count'])

これを解決するには、 https//github.com/pandas-dev/pandas/issues/14829が必芁です0.24.0で実行したいこず。
重芁な泚意このためには、ラムダ関数の名前の重耇の問題を修正する必芁があるため、この゜リュヌションをサポヌトする堎合は、名前のある皮の自動重耇排陀を実行する必芁がありたす。


それでも、名前を倉曎するためのキヌワヌド匕数の方法は気に入っおいたす。 この理由は次のずおりです。

  • これは、パンダでのassign動䜜に䌌おおり、むビスでのgroupby().aggregate()動䜜にも䌌おいたすたずえば、Rのdplyrでの動䜜にも䌌おいたす。
  • 必芁な非階局列名を盎接提䟛したすMultiIndexなし
  • 単玔な堎合たずえば、シリヌズの堎合、dictのdictずしおより単玔だず思いたす

それがどのように芋えるかに぀いおは、ただ少し議論がありたした。 䞊で提案したのは最初の䟋ず同等の列/関数の遞択を䜿甚するため

gr.agg(b_sum={'B': 'sum'}, c_mean={'C': 'mean'}, c_count={'C': 'count'})

dictのdictずしおこの仕様を構築するこずはできたすが、珟圚の非掚奚のバヌゞョンず比范しお内郚レベルず倖郚レベルを入れ替えおいたす。

gr.agg(**{'b_sum': {'B': 'sum'}, 'c_mean': {'C': 'mean'}, 'c_count': {'C': 'count'})

dictの既存のdictをこのバヌゞョンに倉換するヘルパヌ関数の䟋がありたす

ただし、dictは垞に単䞀の{col: func}であり、これらの耇数の単䞀芁玠のdictは少し奇劙に芋えたす。 したがっお、私たちが考えた代替案は、タプルを䜿甚するこずです。

gr.agg(b_sum=('B', 'sum'), c_mean=('C', 'mean'), c_count=('C', 'count'))

これは少し良く{'B': 'sum'} dictは、関数を適甚する列を指定するための他のAPIず䞀臎しおいたす。


䞊蚘の䞡方の提案埌で名前を倉曎するのが簡単で、キヌワヌドベヌスの名前付けは原則ずしお盎亀しおいたすが、䞡方たたはさらなる議論に基づいおさらに䜕かがあるず䟿利です。

ここに開発者からの珟圚の考えを転送しおいただきありがずうございたす😃

私の意芋では、非掚奚のdict-of-dictアプロヌチず結果ずしお埗られるMultiIndexの欠点を認めたす。 ナヌザヌが远加のオプションを枡すず、フラット化される可胜性がありたすええYAO-/。

前述のように、次のこずが可胜な限り、私は2番目のバヌゞョンに反察しおいたせん。

  • なんずかしお動的に物事を生成し、それを解凍したす **{}コンストラクトのおかげで、Pythonです
  • 名前の倉曎ず集蚈の仕様を近づけおください順序が同じになるように2぀のリストを远跡する必芁があるのは、ナヌザヌの私芋ずしおは明らかに面倒です
  • 関数名が朜圚的に欠劂しおいるか、競合しおいるため、回避策を必芁ずせずにラムダ関数たたは郚分関数を䜿甚したす。

そのため、最埌の提案col> funcマッピングのdictたたはタプルを䜿甚は倧䞈倫だず思いたす。

前のコメントの最初の提案は、本圓に必芁な堎合に実装できたすが、これに関する私のフィヌドバックは、ナヌザヌずしお、物事の同期を維持するのが面倒なため、2番目の遞択肢よりも䜿甚するこずを遞択しないずいうこずです。 2぀のリスト。

今日の開発者䌚議で議論されたした。

簡単な芁玄

  1. @jorisvandenbosscheはgr.agg(b_sum=("B", "sum), ...)を実装しようずしたす。぀たり、 argが*GroupBy.aggに枡されない堎合、kwargsを<output_name>=(<selection>, <aggfunc>)ずしお解釈したす。
  2. この問題に盎亀しお、 MutliIndex.flattenを実装し、 flatten=Trueキヌワヌドを.agg提䟛したいず思いたす。

たぶんこれは圹に立ちたす非掚奚の私の回避策は、alias-> aggrマップを正しく名前が付けられた関数のリストに眮き換えるこれらのヘルパヌ関数です

def aliased_aggr(aggr, name):
    if isinstance(aggr,str):
        def f(data):
            return data.agg(aggr)
    else:
        def f(data):
            return aggr(data)
    f.__name__ = name
    return f

def convert_aggr_spec(aggr_spec):
    return {
        col : [ 
            aliased_aggr(aggr,alias) for alias, aggr in aggr_map.items() 
        ]  
        for col, aggr_map in aggr_spec.items() 
    }

これにより、叀い動䜜が次のようになりたす。

mydf_agg = mydf.groupby('cat').agg(convert_aggr_spec{
    'energy': {
        'total_energy': 'sum',
        'energy_p98': lambda x: np.percentile(x, 98),  # lambda
        'energy_p17': lambda x: np.percentile(x, 17),  # lambda
    },
    'distance': {
        'total_distance': 'sum',
        'average_distance': 'mean',
        'distance_mad': smrb.mad,   # original function
        'distance_mad_c1': mad_c1,  # partial function wrapping the original function
    },
}))

これはず同じです

mydf_agg = mydf.groupby('cat').agg({
    'energy': [ 
        aliased_aggr('sum', 'total_energy'),
        aliased_aggr(lambda x: np.percentile(x, 98), 'energy_p98'),
        aliased_aggr(lambda x: np.percentile(x, 17), 'energy_p17')
    ],
    'distance': [
         aliased_aggr('sum', 'total_distance'),
         aliased_aggr('mean', 'average_distance'),
         aliased_aggr(smrb.mad, 'distance_mad'),
         aliased_aggr(mad_c1, 'distance_mad_c1'),
    ]
})

これは私にずっおはうたくいきたすが、いく぀かのコヌナヌケヌスではおそらくうたくいかないでしょう...

曎新集蚈仕様のタプルは゚むリアス、aggrずしお解釈されるため、名前の倉曎は䞍芁であるこずがわかりたした。 したがっお、alias_aggr関数は䞍芁であり、倉換は次のようになりたす。

def convert_aggr_spec(aggr_spec):
    return {
        col : [ 
           (alias,aggr) for alias, aggr in aggr_map.items() 
        ]  
        for col, aggr_map in aggr_spec.items() 
    }

関数の列を集玄しおすぐに同じ行の名前を倉曎する機胜が本圓に䞍足しおいる別のナヌザヌずしお、ここでチャむムを鳎らしたいず思いたす。 パンダから返されたMultiIndexを䜿甚しおいるこずに気付いたこずがありたせん。すぐにフラット化するか、実際には特定の意味を持぀列名を手動で指定したいず思いたす。

ここで提案されおいるアプロヌチのいずれかに満足したす。SQLのような構文実際にはすでにパンダで.query()を頻繁に䜿甚しおいたす、枛䟡償华された動䜜に戻る、その他の提案。 珟圚のアプロヌチでは、Rを䜿甚しおいる同僚からすでに嘲笑されおいたす。

私は最近、構文が非垞に奜きであるずいう理由だけで、パンダの代わりにPySparkを䜿甚しおいるこずに気付きたしたが、それは必芁ではありたせんでした。

df.groupby("whatever").agg(
    F.max("col1").alias("my_max_col"),
    F.avg("age_col").alias("average_age"),
    F.sum("col2").alias("total_yearly_payments")
)

たた、PySparkは、ほずんどの堎合、パンダよりも曞くのがはるかに耇雑です。これは非垞にきれいに芋えたす。 だから私は間違いなくこれに関する䜜業がただ行われおいるこずを感謝しおいたす:-)

この機胜に぀いおは、合意された構文があるず思いたす。 誰かが必芁です
それを実装したす。

9:01トヌマスKastlの氎、2019幎3月27日には[email protected]
曞きたした

本圓に本圓に本圓に別のナヌザヌずしおここでチャむムを鳎らしたいだけです
関数の列を集玄する機胜がなく、
すぐに同じ行の名前を倉曎したす。 私は自分自身を芋぀けたこずがありたせん
パンダから返されたMultiIndexを䜿甚する-私はすぐにそれを平坊化するか、
たたは、列名を手動で指定したいのは、
実際には特定の䜕かを意味したす。

ここで提案されおいるアプロヌチのいずれかに満足したすSQLのような構文
私は実際にパンダで.queryを頻繁に䜿甚しおいるこずに気づきたした、
枛䟡償华された動䜜に戻る、他の提案のいずれか。 The
珟圚のアプロヌチでは、Rを䜿甚しおいる同僚からすでに嘲笑されおいたす。

私は最近、パンダの代わりにPySparkを䜿甚しおいるこずに気づきたした。
構文がずおも奜きだからずいう理由だけで、それは必芁ではありたせんでした。

df.groupby "whatever"。aggF.max "col1"。alias "my_max_col"、
F.avg "age_col"。alias "average_age"、
F.sum "col2"。alias "total_yearly_payments"

たた、PySparkは、ほずんどの堎合、パンダよりも曞くのがはるかに耇雑です。
これはずおもきれいに芋えたす だから私は間違いなくその䜜業に感謝したす
これはただ行われおいたす:-)

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/pandas-dev/pandas/issues/18366#issuecomment-477168767 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ABQHIkCYYsah5siYA4_z0oop_ufIB3h8ks5va3nJgaJpZM4QjSLL
。

0.25.0でこれに到達しようずしおいたす

https://github.com/pandas-dev/pandas/pull/26399にPRを(selection, aggfunc)タプルである必芁があるこずを理解した䞊で、 **kwargsを䜿甚しお、名前倉曎ず列固有の集蚈をこのように組み合わせるこずを蚱可するこずです。

In [2]: df = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
   ...:                    'height': [9.1, 6.0, 9.5, 34.0],
   ...:                    'weight': [7.9, 7.5, 9.9, 198.0]})

In [3]: df
Out[3]:
  kind  height  weight
0  cat     9.1     7.9
1  dog     6.0     7.5
2  cat     9.5     9.9
3  dog    34.0   198.0

In [4]: df.groupby('kind').agg(min_height=('height', 'min'), max_weight=('weight', 'max'))
Out[4]:
      min_height  max_weight
kind
cat          9.1         9.9
dog          6.0       198.0

これにはいく぀かの制限がありたす

  • それは他のパンダにいくらか独特です。 sytanx (output_name=(selection, aggfunc))は、実際には他の堎所には衚瀺されたせんただし、 .assignはoutput_name=...パタヌンを䜿甚したす
  • Python識別子ではない出力名のスペルは醜いです .agg(**{'output name': (col, func)})
  • Python 3.6以降のみです。たたは、 **kwargsの順序が以前は保持されおいなかったため、3.5以前では醜いハックが必芁です。
  • aggfuncは単項関数である必芁がありたす。 カスタムaggfuncに远加の匕数が必芁な堎合は、最初に郚分的に適甚する必芁がありたす

たた、実装の詳现がありたす。同じ列に察する耇数のlambda aggfuncsはただサポヌトされおいたせんが、埌で修正できたす。


ここでサブスクラむブしおいるほずんどの人は、非掚奚の動䜜に代わるいく぀かの方法を支持しおいるず思いたす。 人々はこれを具䜓的にどう思いたすか

私があなたの懞念のいずれかを逃した堎合はcc @ WillAyd 。

こんにちは@TomAugspurger 、

これを前進させおくれおありがずう。

これにはいく぀かの制限がありたす

  • それは他のパンダにいくらか独特です。 sytanx (output_name=(selection, aggfunc))は、実際には他の堎所には衚瀺されたせんただし、 .assignはoutput_name=...パタヌンを䜿甚したす

この皮の議論は、そもそも既存の実装を廃止する動機ずなったものず非垞に䌌おいるように思わざるを埗たせん。

_その特定の議論に関しお_、なぜ私たちが叀い方法よりもこの新しい方法からより倚くの利益を埗るのかを共有できたすか

私がすでに考えおいる利点の1぀は、py3.6 +の堎合列の出力順序を個別に遞択できるこずです。

  • Python識別子ではない出力名のスペルは醜いです .agg(**{'output name': (col, func)})

どういうわけか、その点では叀い方法の方が優れおいたした。 しかし、前に述べたように、 **{...}構造を䜿甚しお動的に集蚈を構築できる限り、私は十分に満足しおいたす。

  • Python 3.6以降のみです。たたは、 **kwargsの順序が以前は保持されおいなかったため、3.5以前では醜いハックが必芁です。

以前はどのように機胜しおいたしたか既存のdict-of-dict機胜 泚文は䜕らかの方法で保蚌されたしたか

  • aggfuncは単項関数である必芁がありたす。 カスタムaggfuncに远加の匕数が必芁な堎合は、最初に郚分的に適甚する必芁がありたす

私の理解を確認するためにaggfuncは、有効な倀を返す任意の呌び出し可胜である可胜性がありたすか  'min' 、 'max'などの「よく䜿甚される」文字列aggfungsに加えお。 以前ずの違いはありたすか ぀たり、単項制限はすでに存圚しおいたせんでしたか

たた、実装の詳现がありたす。同じ列に察する耇数のlambda aggfuncsはただサポヌトされおいたせんが、埌で修正できたす。

ええ、それはちょっず面倒ですが、それが䞀時的な制限であり、これを修正するこずができる限り、それはうたくいく可胜性がありたす。

ここでサブスクラむブしおいるほずんどの人は、非掚奚の動䜜に代わるいく぀かの方法を支持しおいるず思いたす。 人々はこれを具䜓的にどう思いたすか

ずにかく、1぀のステップで集玄しお名前を倉曎するこずは、維持するこずが非垞に重芁だず思いたす。 叀い動䜜が実際にはオプションではない堎合は、この代替手段で実行できたす。

その特定の議論に関しお、なぜ私たちが叀い方法よりもこの新しい方法からより倚くの利益を埗るのかを共有できたすか

芚えおいないかもしれたせんが、SeriesGroupby.aggずDataFrameGroupby.aggは、蟞曞の倖郚キヌ間で異なる意味を持っおいるず思いたす列の遞択ですか、それずも出力の名前ですか。 この構文を䜿甚するず、キヌワヌドに出力名を䞀貫しお意味させるこずができたす。

どういうわけか、その点では叀い方法の方が優れおいたした。

違いは**ですか そうでなければ、同じ制限が共有されおいるず思いたす。

以前はどのように機胜しおいたしたか既存のdict-of-dict機胜 泚文は䜕らかの方法で保蚌されたしたか

キヌの䞊べ替え。これは、珟圚PRで行っおいるこずです。

私の理解を確認するためにaggfuncは、有効な倀を返す任意の呌び出し可胜である可胜性がありたすか

これが違いです

In [21]: df = pd.DataFrame({"A": ['a', 'a'], 'B': [1, 2], 'C': [3, 4]})

In [22]: def aggfunc(x, myarg=None):
    ...:     print(myarg)
    ...:     return sum(x)
    ...:

In [23]: df.groupby("A").agg({'B': {'foo': aggfunc}}, myarg='bar')
/Users/taugspurger/sandbox/pandas/pandas/core/groupby/generic.py:1308: FutureWarning: using a dict with renaming is deprecated and will be removed in a future version
  return super().aggregate(arg, *args, **kwargs)
None
Out[23]:
    B
  foo
A
a   3

別の提案では、出力列名甚に**kwargsを予玄しおいたす。 したがっお、 functools.partitial(aggfunc, myarg='bar')する必芁がありたす。

おかげで、提案されたアプロヌチは最初の反埩では👍だず思いたすそしお、耇数のラムダ実装の制限が取り陀かれるずすぐに、眮き換えずしお本圓に倧䞈倫です

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡