Pandas: Groupby.agg рдореЗрдВ рдбрд┐рдХреНрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХрд╛ рдмрд╣рд┐рд╖реНрдХрд░рдг рдХрдИ рдореБрджреНрджреЛрдВ рдХреЛ рд▓рд╛рддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдирд╡ре░ 2017  ┬╖  37рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pandas-dev/pandas

groupby.agg рдореЗрдВ рдбрд┐рдХреНрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╣рд┐рд╖реНрдХрд░рдг рдХреЗ рдмрд╛рдж #15931 рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдиреАрдЪреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдкрд░ рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ https://github.com/pandas-dev/pandas/pull/15931#issuecomment -336139085 рдЬрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рдИ рдЧрдИ рд╣реИрдВред

#15931 рдХреЗ рдкрджрд╛рд╡рдирддрд┐ рдХреЗ рдкреАрдЫреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдФрд░ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдХреЗ рдмреАрдЪ agg() рд▓рд┐рдП рдПрдХ рд╕реБрд╕рдВрдЧрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдереА (рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП #14668 рднреА рджреЗрдЦреЗрдВ)ред

рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рддрд╛рдирд╛рд╢рд╛рд╣реА рдХреЗ рд╕рд╛рде рдкреБрди: рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдФрд░/рдпрд╛ рдЕрд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдХреАрдордд рдкрд░ рдЖрддрд╛ рд╣реИ: рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреБрд▓ рдФрд░ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рдореБрджреНрджреЛрдВ рдФрд░ рдХреБрдЫ рдкрд┐рдЫрдбрд╝реЗ рдЕрд╕рдВрдЧрддрд┐ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдИ рд╕рдордЭрджрд╛рд░ рд╕рдорд╛рдзрд╛рди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ:

  • _[рдХрд╖реНрдЯрдкреНрд░рдж]_ рдкрд░рд┐рдгрд╛рдореА рд╕реНрддрдВрднреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдкрд░ рдЕрдм рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд╣реИ
  • _[рдХрд╖реНрдЯрдкреНрд░рдж]_ рдЖрдкрдХреЛ рдорд▓реНрдЯреАрдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ _after_ рдПрдХрддреНрд░реАрдХрд░рдг рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдореЗрдВ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреЙрд▓рдо рдХреЗ рдХреНрд░рдо рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ... рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдмрд┐рд▓реНрдХреБрд▓ рдЕрд╕рдВрднрд╡ (рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдорд╛рдорд▓реЗ) )
  • я╕П _ [рдмреНрд░реЗрдХрд┐рдВрдЧ] _ рдПрдХ рд╣реА рдЗрдирдкреБрдЯ рдХреЙрд▓рдо рдкрд░ рдПрдХ рд╣реА рдЖрдВрддрд░рд┐рдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЛ рдЙрдк-рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ:

    • _ [рдмреНрд░реЗрдХрд┐рдВрдЧ] _ рдЕрдм рдЖрдк рдПрдХ рд╣реА рдХреЙрд▓рдо рдкрд░ рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рд▓реИрдореНрдмреНрдбрд╛ рдПрдЧреНрд░реАрдЧреЗрдЯрд░реНрд╕ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

    • _ [рдмреНрд░реЗрдХрд┐рдВрдЧ] _ рдЖрдк рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдПрдЧреНрд░реАрдЧреЗрдЯрд░реНрд╕ рдХреЛ рдЖрдВрд╢рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рддрдм рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЙрдирдХреА рдЫрд┐рдкреА рд╣реБрдИ __name__ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреЗ

рдЙрджрд╛рд╣рд░рдг

_(рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЛрдб рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╕рднреА рдореБрджреНрджреЛрдВ рдиреЗ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рд╕реЗ рдХрд╛рдЯ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдпрд╣рд╛рдВ рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ )_

рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛рдлреНрд░реЗрдо

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>

рдкрд┐рдЫрдбрд╝рд╛ рдЕрд╕рдВрдЧрдд рдкреНрд░рддрд┐рдЧрдорди: рдПрдХ рд╣реА рдореВрд▓ рдХреЙрд▓рдо рдореЗрдВ рдЕрдм рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реИрдореНрдмреНрдбрд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдХреЛрдИ рдКрдкрд░ рд╕реЗ 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

рд╕реНрдерд┐рд░ рдХреЗ рд╕рд╛рде

  • рдПрдХ рд╕реНрддрдВрдн рдЕрдиреБрдкрд▓рдмреНрдз (98рд╡рд╛рдВ рд╢рддрдордХ)
  • рдорд▓реНрдЯреАрдЗрдВрдбреЗрдХреНрд╕ рдХреЙрд▓рдо рдХреА рд╣реИрдВрдбрд▓рд┐рдВрдЧ
  • рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛

рдЕрд▓рдЧ рдЪрд░рдг рдореЗрдВ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдПред

рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдореВрд▓ рдХреЙрд▓рдо рдирд╛рдо рдФрд░ _рдПрдЧреНрд░реАрдЧреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо_ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреБрдЫ рд╕рдВрдпреЛрдЬрди рд╣реИ:

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)

рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдирд╛рдордХрд░рдг рдХреЛрдб (рдЬреЛ рдЕрдм рдХреЛрдб рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЛ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдордиреНрд╡рдпрд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдПрдХрддреНрд░реАрдХрд░рдг рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ...

рдЙрджрд╛рд╕ рдкрд╛рдВрдбрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдЬреЛ рдЕрднреА рднреА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рдВрдбрд╛ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ)


рдореИрдВ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ, рдФрд░ рд╕рд╛рде рд╣реА рдореБрдЭреЗ _рдПрдЧреНрд░реАрдЧреЗрдЯ рдФрд░ рдирд╛рдо рдмрджрд▓реЗрдВ_ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╣рд┐рд╖реНрдХрд░рдг рдкрд░ рдЧрд╣рд░рд╛ рдЦреЗрдж рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рджрд░реНрдж рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред


рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди

  • рдбрд┐рдХреНрдЯ-рдСрдл-рдбрд┐рдХреНрдЯ рд░реАрд▓реЗрдмрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ
  • рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ (рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдХреНрдпреЛрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддреН рдПрдХрддреНрд░реАрдХрд░рдг?)
  • ??? (рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛)

_рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрдврд╝реЗрдВ:_

рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдорд╣реАрдиреЛрдВ рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдХрд╛рд░рдг рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдЗрд╕ рдкрджрд╛рд╡рдирддрд┐ рд╕реЗ рдЗрддрдирд╛ рдкрд░реЗрд╢рд╛рди рдХреНрдпреЛрдВ рд╣реВрдВ: "рдХреБрд▓ рдФрд░ рдирд╛рдо рдмрджрд▓реЗрдВ" рдПрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдмрд╛рдд рд╣реИ SQL рдореЗрдВ рдЧреНрд░реБрдк рдмрд╛рдп рдПрдЧреНрд░реАрдЧреЗрд╢рди рдХреНрдпреЛрдВрдХрд┐ SQL рдореЗрдВ рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдПрдЧреНрд░реАрдЧреЗрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдЧрдВрддрд╡реНрдп рдХреЙрд▓рдо рдирд╛рдо рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ SELECT col1, avg(col2) AS col2_mean, stddev(col2) AS col2_var FROM mytable GROUP BY col1 ред

рдореИрдВ _not_ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдкрдВрдбреЛрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ SQL рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рддрд╛рдирд╛рд╢рд╛рд╣реА рдПрдкреАрдЖрдИ рдХрдИ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреНрдпреЛрдВ рдерд╛ред

(* рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рддрд╛рдирд╛рд╢рд╛рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрдЯрд┐рд▓ рд╣реИред)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдореИрдВ рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХрдо рди рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред

рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдЗрдерди рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо-рд╕реНрдерд╛рди (рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЛ рдХреЙрд▓рдо рдирд╛рдореЛрдВ (рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЧрд╣рд░рд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо '<lambda>' рдирд╛рдо рдХреЗ рдХреЙрд▓рдо (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рдХреЙрд▓рдо) рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдореБрдЭреЗ рдЧрдВрднреАрд░ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдЕрд╕рдВрдЧрддрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдордзреНрдпрд╕реНрде рдХрджрдо рд╣реИ рдЬрд╣рд╛рдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ (рдФрд░ рдЙрдЬрд╛рдЧрд░) рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЛ рдЗрдзрд░-рдЙрдзрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдиреНрд╣реЗрдВ рдордЬрд╝рдмреВрддреА рд╕реЗ, рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рдирд╛рдо рдмрджрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдиреЗрд╕реНрдЯреЗрдб dict рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдЯреАрдПрд▓; рдбреАрдЖрд░ рдХреГрдкрдпрд╛ рдореВрд▓реНрдпрд╣реНрд░рд╛рд╕ рди рдХрд░реЗрдВред :)

рд╕рднреА 37 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@zertrin : рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ #15931 рдореЗрдВ рдХрд╛рдлреА рдЪрд░реНрдЪрд╛ рд╣реБрдИ рдереАред рдЪреВрдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдкреВрд░рд╛ рдирд╣реАрдВ рдкрдврд╝ рдкрд╛рдпрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕рдордп рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдкрд┐рдВрдЧ рдХрд░рдиреЗ рджреЛ:

@jreback @jorisvandenbossche @TomAugspurger @chris-b1

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд░реНрддрдорд╛рди agg рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдирд╛рдо рдмрджрд▓рдирд╛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрд╣реБрдд рд╣реА рднрджреНрджрд╛ рдФрд░ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИред рдиреЗрд╕реНрдЯреЗрдб рдбрд┐рдХреНрдЯреНрд╕ рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 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))

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдореИрдВ рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХрдо рди рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред

рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдЗрдерди рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо-рд╕реНрдерд╛рди (рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЛ рдХреЙрд▓рдо рдирд╛рдореЛрдВ (рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЧрд╣рд░рд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо '<lambda>' рдирд╛рдо рдХреЗ рдХреЙрд▓рдо (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рдХреЙрд▓рдо) рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдореБрдЭреЗ рдЧрдВрднреАрд░ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдЕрд╕рдВрдЧрддрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдордзреНрдпрд╕реНрде рдХрджрдо рд╣реИ рдЬрд╣рд╛рдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ (рдФрд░ рдЙрдЬрд╛рдЧрд░) рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЛ рдЗрдзрд░-рдЙрдзрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдиреНрд╣реЗрдВ рдордЬрд╝рдмреВрддреА рд╕реЗ, рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рдирд╛рдо рдмрджрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдиреЗрд╕реНрдЯреЗрдб dict рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдЯреАрдПрд▓; рдбреАрдЖрд░ рдХреГрдкрдпрд╛ рдореВрд▓реНрдпрд╣реНрд░рд╛рд╕ рди рдХрд░реЗрдВред :)

рдореЗрд░рд╛ рдпреЛрдЧрджрд╛рди рджреЛ рдЪреАрдЬреЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИред

  1. рдореИрдВ рдкрдВрдбреЛрдВ рдХреЗ рдлреВрд▓рд╛ рд╣реБрдЖ рдПрдкреАрдЖрдИ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛ рд╕реЗ рдЕрд╡рдЧрдд рд╣реВрдВ рдФрд░ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рднрд▓реЗ рд╣реА рдореИрдВ "рдлреВрд▓рд╛ рд╣реБрдЖ" рдПрдкреАрдЖрдИ рддрддреНрд╡реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдерд┐рдд рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЧреБрдорд░рд╛рд╣ рд╣реВрдВ, рдлрд┐рд░ рднреА рдореЗрд░реА рд░рд╛рдп рд╣реИ рдХрд┐ рдкрдВрдбреЛрдВ рдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  2. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХрд┐рд╕реА рдХреА рдЗрдЪреНрдЫрд╛рдУрдВ рдФрд░ рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫреА рдХреБрдХрдмреБрдХ рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдореИрдВ рдпрд╣ рджрд╛рд╡рд╛

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рдВрдбрд╕ рд╕реАрд░реАрдЬрд╝ рдФрд░ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП pipe рддрд░реАрдХреЗ рд╣реИрдВред рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЦрдВрдб рдореЗрдВ рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ рдХрд┐ рд╣рдо рдЙрдкрд╡рд░реНрдЧ рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд▓рд┐рдП pipe рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕реА рднрд╛рд╡рдирд╛ рдореЗрдВ, рд╣рдо рд╕рдорд╛рди рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП GroupBy.pipe рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдЧреНрд░реБрдкрдмрд╛рдп рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ @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 рд╡рд┐рдзрд┐ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирдП рдПрдкреАрдЖрдИ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬреЛрдбрд╝ рджреЗрддреА рд╣реИред рдпрд╣ рдЙрд╕ рдкрджрд╛рд╡рдирдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕рд╛рдзрди рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдмрд╣рд┐рд╖реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рд╣реВрдВред

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ tdpetro рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ - рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: names=name_dict ред

рдпрд╣ рд╕рднреА рдХреЛ рдЦреБрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЙрд▓рдо рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рджреЗрддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреЛрд╕реНрдЯ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЙрд╕ рд╕реНрдерд╛рди рдХреЛ рдбреАрдХреЙрдкреНрд▓рд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдореА рдХреЙрд▓рдо рдХреЗ рдирд╛рдо рд╕реЗ рдХреБрд▓ рдСрдкрд░реЗрд╢рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ "рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝" рд╣реИрдВред

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ (рдЖрдЦрд┐рд░рдХрд╛рд░ рдпрд╣ рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдЙрддрдирд╛ рдЖрд╕рд╛рди рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд┐рддрдирд╛ рдХрд┐ рддрд╛рдирд╛рд╢рд╛рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдгред рдореЗрд░рд╛ рдорддрд▓рдм рдпрд╣рд╛рдВ рд╣реИ рдХрд┐ рд▓реЗрдЦрди рдХреЗ рд╕рдордп рдЖрдкрдХреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рджреЛрдиреЛрдВ рдбрд┐рдХреНрдЯреНрд╕ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕реНрд░реЛрдд рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп, рдкрд╛рдардХ рдХреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдХреБрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рджреВрд╕рд░реЗ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдирд╛рдореЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рджреЛ рдмрд╛рд░ рдкреНрд░рдпрд╛рд╕ рд╣реИред

рдиреЗрд╕реНрдЯреЗрдб рдбрд┐рдХреНрдЯреНрд╕ рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рдЕрднреА рднреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рд╣рд░ рдХреЛрдИ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рддрд╛рдирд╛рд╢рд╛рд╣реА рдЬрдЯрд┐рд▓ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрджрд┐ names рдХреАрд╡рд░реНрдб рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдкрд╛рдВрдбрд╛ рдЯреАрдо рд╕рд╣рдЬ рд╣реИ, рддреЛ рдпрд╣ рдЕрднреА рднреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред

@pirsquared рд╡рд░реНрддрдорд╛рди рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╛рдзрд╛рдиред рдпрджреНрдпрдкрд┐ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╕рдордЭрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ (рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рднреНрд░рдорд┐рдд:)

рдореИрдВрдиреЗ рдбреЗрдЯрд╛рд╕рд╛рдЗрдВрд╕ рд╕рдмреНрд░реЗрдбрд┐рдЯ рдкрд░ рдПрдХ рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ - рдЖрдк рдкрд╛рдВрдбрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдирдлрд░рдд рдХрд░рддреЗ рд╣реИрдВ? . рдХрд┐рд╕реА рдиреЗ groupby рдмрд╛рдж рд▓реМрдЯреЗ рдорд▓реНрдЯреАрдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЕрд╡рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрдХреЛ рд▓рд╛рдпрд╛ рдФрд░ dplyr do рдХреНрд░рд┐рдпрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд┐рд╕реЗ plydata рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ agg_assign рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред

@zertrin agg_assign рдЖрдкрдХреЗ рддрд╛рдирд╛рд╢рд╛рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдФрд░ sql рдПрдЧреНрд░реАрдЧреЗрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ рдФрд░ рд╕рд╛рде рд╣реА рдХрдИ рдХреЙрд▓рдо рдХреЛ рдПрдЧреНрд░реАрдЧреЗрд╢рди рдХреЗ рднреАрддрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдпрд╣ рд╕рдорд╛рди рд░реВрдк рд╕реЗ DataFrame.assign рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ @jreback @TomAugspurger ?

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

рдпрджреНрдпрдкрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдХрд┐рд╕реА рдХреЛ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдПрдкреАрдЖрдИ (рдЬреИрд╕рд╛ рдХрд┐ .agg_assign рд▓рд┐рдП рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдЬрд┐рд╕реЗ рдРрд╕реЗ рдмреБрдХ-рдХреАрдкрд┐рдВрдЧ рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рд╣реИред

рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрд▓реАрди рдЕрдк рдХреЛрдб рдХрд╛ рдореБрджреНрджрд╛ рднреА рд╣реИред рдЬрдм 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)
}

рдпрд╣ рдХрд╛рдлреА рд▓рдЪреАрд▓рд╛ рд╣реЛрдЧрд╛ рдФрд░ рдореЗрд░реЗ рдУрдкреА рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рднреА рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛ред

@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 рдХреА рддрд░рд╣ рдХреБрдЫ рд╣реИ self.get_group(group) рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП self , рдПрдХ DataFrameGroupBy рд╡рд╕реНрддреБред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╛рдордХрд░рдг рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ **kwargs , рдЪрдпрди рд╕реЗ , рдЬреЛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИред

рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдЕрдЪреНрдЫреЗ, рд╕рд╛рдорд╛рдиреНрдп рдПрдХрддреНрд░реАрдХрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдм рдХреЙрд▓рдо рдЪрдпрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдИ рдореБрдлреНрдд рд▓рдВрдЪ рдирд╣реАрдВ рд╣реИ! рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк lambda x: x[col].min рдЬреИрд╕реЗ рдХрдИ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдЖрдкрдХреЛ np.min рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рд╕реЗ рднреА рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рд╕рднреА рдЖрдпрд╛рдореЛрдВ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рдмрдирд╛рдо pd.DataFrame.min , рдЬреЛ axis=0 рд╕реЗ рдЕрдзрд┐рдХ рдХрдо рдХрд░рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЬреИрд╕реЗ рдХреБрдЫ agg_assign рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ apply ред apply рдЕрднреА рднреА рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдо-рд╡рд╛рд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдЗрди рдЯреНрд░реЗрдбрдСрдлрд╝ рдмрдирд╛рдо рддрд╛рдирд╛рд╢рд╛рд╣реА рдкрджреНрдзрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рд╣реВрдВред рдпрд╣рд╛рдВ 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 рдХрд░рддрд╛ рд╣реИ...

рдХреНрдпрд╛ рдкрдВрдбреЛрдВ рдХреА рдХреЛрд░ рдЯреАрдо рдореЗрдВ рд╕реЗ рдХреЛрдИ рдХреГрдкрдпрд╛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ groupby.agg рдореЗрдВ рдбрд┐рдХреНрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИ?

рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреЛрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ - рддреЛ рдореИрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рднреА рдЪреБрдиреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рдордХрд╛рдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ ...

рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдкрдВрдбреЛрдВ рдХреА рдХреЛрд░ рдЯреАрдо рдореЗрдВ рд╕реЗ рдХреЛрдИ рдХреГрдкрдпрд╛ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ groupby.agg рдореЗрдВ рдбрд┐рдХреНрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИ?

рдХреНрдпрд╛ рдЖрдкрдиреЗ https://github.com/pandas-dev/pandas/pull/15931/files#diff -52364fb643114f3349390ad6bcf24d8fR461 рджреЗрдЦрд╛?

рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░рдг рдпрд╣ рдерд╛ рдХрд┐ рджреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдирд╛рд╢рд╛рд╣реА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЛ рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕реАрд░реАрдЬ/рд╕реАрд░реАрдЬ рдЧреНрд░реБрдкрдмреА рдХреЗ рд▓рд┐рдП, рд╡реЗ рдирд╛рдордХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реИрдВред 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

рдпрд╣ рд╢рд╛рдпрдж рдкрдВрдбреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рд╣рдо рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ :) рдореИрдВ рд╢рд╛рдпрдж рдХреБрдЫ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рднрд▓реЗ рд╣реА рд╣рдо рддрд╛рдирд╛рд╢рд╛рд╣реА рдПрдХрддреНрд░реАрдХрд░рдг рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдлрд┐рд░ рднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╛рдордХрд░рдг рдФрд░ рд╕реНрддрдВрдн рдЪрдпрди рдХреЗ рдмреАрдЪ рдЕрд╕рдВрдЧрддрд┐ рд╣реИ:

Series/SeriesGroupBy рдХреЗ рд▓рд┐рдП рдбрд┐рдХреНрд╢рдирд░реА рдХреАрдЬрд╝ рд╣рдореЗрд╢рд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдирд╛рдордХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИрдВред

DataFrame / DataFrameGroupby рдХреЗ рд▓рд┐рдП, рддрд╛рдирд╛рд╢рд╛рд╣реА рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╣рдореЗрд╢рд╛ рдЪрдпрди рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИрдВред dict-of-dicts рдХреЗ рд╕рд╛рде рд╣рдо рдПрдХ рдХреЙрд▓рдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЖрдВрддрд░рд┐рдХ рдирд┐рд░реНрджреЗрд╢ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдирд╛рдордХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ Series / SeriesGroupByред

рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдереА (рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдмрд╣рд┐рд╖реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рдореЗрдВ), рдФрд░ рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛: https://github.com/pandas-dev/pandas/pull/14668#issuecomment -274508089ред рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдХреЗрд╡рд▓ рдмрд╣рд┐рд╖реНрдХрд░рдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рди рдХрд┐ рдбрд┐рдХреНрдЯреНрд╕ ('рдирд╛рдо рдмрджрд▓рдиреЗ' рдлрд╝рдВрдХреНрд╢рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ dicts рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ 'рдЪрдпрди' (рдЖрдк рдХрд┐рд╕ рдХреЙрд▓рдо рдкрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдФрд░ 'рдирд╛рдордХрд░рдг' (рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдкрд░рд┐рдгрд╛рдореА рдХреЙрд▓рдо рдирд╛рдо рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕, рдбрд┐рдХреНрдЯреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреАрд╡рд░реНрдб рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ agg_assign рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред
рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ, рдЪрд╛рд╣реЗ рд╡рд╣ agg рд╣реА рд╣реЛ рдпрд╛ agg_assign рдЬреИрд╕реА рдирдИ рд╡рд┐рдзрд┐ рдореЗрдВред

рдЬреЛ рдореИрдВрдиреЗ рд╡рд╛рдкрд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ agg_assign рдЬреИрд╕рд╛ рдХреБрдЫ рдерд╛ рд▓реЗрдХрд┐рди рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддрд┐ рдХреАрд╡рд░реНрдб рдПрдХ рддрд╛рдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдпрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рджрд┐рдд, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:

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') рдХреНрдпрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛? рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд╕рднреА рд╕реНрддрдВрднреЛрдВ рдкрд░ 'рдорд╛рдзреНрдп' рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдХреЛрдИ рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ (рдкрд╣рд▓реЗ {'col1' : {'foo': 'mean'}, 'col2': {'foo':'mean'}, 'col3': ...} рд╕рдорд╛рди)ред рд▓реЗрдХрд┐рди, рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрд╣реБ-рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЙрд▓рдо рд╣реЛрдВрдЧреЗ, рдЬрдмрдХрд┐ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдордЖрдИ рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛ рдореМрдЬреВрджрд╛ agg рдХреЗ рдЕрдВрджрд░ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ series рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ:

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

(рдФрд░ рдЖрдк рдЙрдкрд░реЛрдХреНрдд рдПрдХ рдмрд╛рд░ 'рджреВрд░реА' рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рдмрд╛рд░ 'рдКрд░реНрдЬрд╛' рдХреЗ рд▓рд┐рдП рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрдк рд╕рднреА рдбрд┐рдХреНрдЯреНрд╕/рд▓реИрдореНрдмреНрдбрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ)

@TomAugspurger рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ agg_table рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╕рдореВрд╣реЛрдВ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЕрдВрдд рдореЗрдВ рдЕрдХреНрд╖ = 1 рджреНрд╡рд╛рд░рд╛ рдирдП рдХреЙрд▓рдо рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрдХреНрд╖ = 0 рджреНрд╡рд╛рд░рд╛ рдирд╡рдЧрдард┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп?

BTW, @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 рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдлрд┐рд░ рдХрднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ? рдПрдХ рдХреНрдпреВ/рдХреЗрдбреАрдмреА+ рджреБрдирд┐рдпрд╛ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ (рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд╕рдорд╛рди) рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЪрдпрди рдХрдерди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрд╕реНрдерд╛рдпреА рдЪрд░/рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред

рдпрд╣рд╛рдВ рдУ.рдкреА.

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдХрд╣реВрдВ рддреЛ рдЗрддрдиреЗ рд╕рдордп рдХреЗ рдмрд╛рдж рдФрд░ #15931 рдФрд░ рдпрд╣рд╛рдВ рдкрд░ рдХрд╛рдлреА рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж рднреА, рдореБрдЭреЗ рдЕрднреА рднреА рдпрдХреАрди рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд░реА-рд▓реЗрдмрд▓рд┐рдВрдЧ рдбрд┐рдХреНрдЯреНрд╕ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПред

рдЕрдВрдд рдореЗрдВ, рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореМрдЬреВрджрд╛ рд░реАрд▓реИрдмрд▓рд┐рдВрдЧ рддрд╛рдирд╛рд╢рд╛рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг IMHO рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИред рдЬрдм рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдерд╛, рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рд╣реИред

рдмреЗрд╢рдХ рдкрд╛рдВрдбрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрднреА рднреА рдЕрдиреНрдпрдерд╛ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЭреВрдорддреЗ рд╣реБрдПред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд░реАрд▓реЗрдмрд▓рд┐рдВрдЧ рддрд╛рдирд╛рд╢рд╛рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА рдмрд╣реБрдд рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ SQL тАЛтАЛ- func(column_name) as new_column_name рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╛рдпрдерди рдореЗрдВ рд╣рдо рдЗрд╕реЗ рддреАрди-рдЖрдЗрдЯрдо рдЯрдкрд▓ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (func, column_name, new_column_name) ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдбреЗрдХреНрд╕рдкреНрд▓реЛ рдЧреНрд░реБрдкрдмрд╛рдп рдПрдЧреНрд░реАрдЧреЗрд╢рди рдХрд░рддрд╛ рд╣реИред

dexplo

@zertrin рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ: https://github.com/pandas-dev/pandas/issues/18366/#issuecomment -349089667
рдЕрдВрдд рдореЗрдВ, рдпрд╣ рддрд╛рдирд╛рд╢рд╛рд╣реА рдХреЗ рдХреНрд░рдо рдХреЛ рдЙрд▓рдЯ рджреЗрддрд╛ рд╣реИ: "{col: {name: func}}" рдХреЗ рдмрдЬрд╛рдп рдпрд╣ "**{name: {col: func}}" рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛ред

@jorisvandenbossche рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдХреНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн рд▓рд╛рддрд╛ рд╣реИред

рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЧрдП рд╣реИрдВ:

  1. рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХрдо рдХрд░реЗрдВ рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣рд┐рд╖реНрдХрд░рдг рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ, рд╣рдЯрд╛рдП рдЧрдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝реЗрдВ)
  2. рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдХреЛрдб рдореЗрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди, рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЕрд╡рд╣реЗрд▓рдирд╛ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛)

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ 2 рдХреНрдпреЛрдВ рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рд╕рд╛рд░реНрдердХ рдФрд░ рдареЛрд╕ рд▓рд╛рдн рди рд▓рд╛рдПред

рдКрдкрд░ рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ dicts рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ 'рдЪрдпрди' (рдЖрдк рдХрд┐рд╕ рдХреЙрд▓рдо рдкрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдФрд░ 'рдирд╛рдордХрд░рдг' (рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдкрд░рд┐рдгрд╛рдореА рдХреЙрд▓рдо рдирд╛рдо рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред

рдЪреВрдВрдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдореБрджреНрджрд╛ рдерд╛ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рддреБрд░рдВрдд рджреЗрдЦрдиреЗ рдХрд╛ рдмрд┐рдВрджреБ рдорд┐рд▓рд╛ред (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдФрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛: _ "рдпрд╛рдп! рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд┐рд░реНрдорд╛рдг, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдвреВрдВрдв рд░рд╣рд╛ рдерд╛ред рдЕрдЪреНрдЫрд╛ред"_)

рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕, рдбрд┐рдХреНрдЯреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреАрд╡рд░реНрдб рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рддрд╛рдирд╛рд╢рд╛рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдХрд░реНрд╖рдХ рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛрдб рдХреЗ рд╕рд╛рде рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдПрдХ рдХреЗ рдареАрдХ рдКрдкрд░ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдмрддрд╛рдпрд╛, рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреАрд╡рд░реНрдб рддрд░реНрдХреЛрдВ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдЕрднреА рднреА **{name: {col: func}} рдирд┐рд░реНрдорд╛рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреАред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реВрдВред рдЬрдм рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕реНрддрд░ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдореВрд▓реНрдп рд╡рд░реНрдзрд┐рдд рдФрд░ рдРрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреА рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ _рдареАрдХ рд╣реИ рдпрджрд┐ рдкрд╛рдВрдбрд╛ рдХреЛрд░ рджреЗрд╡ рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдордЬрдмреВрдд рднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВред рдореБрдЭреЗ _user_ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдирдП рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдореМрдЬреВрджрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдмрджрд▓рдиреЗ рдХреА рдХрдореА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИ)ред

@zertrin рд╣рдордиреЗ рдХрд▓ рдХреБрдЫ рдореБрдЦреНрдп рдкрд╣рд▓реЗ , рдХреЗрд╡рд▓ рдХрд▓ рдХреЗ рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред


рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдзрд╛рд░рдгрд╛ рдХрд┐ SQL "SELECT avg(col2) as col2_avg" рдЬреИрд╕реА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд рд╣реИрдВ, рдФрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдореВрд▓ рдХрд╛рд░рдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рдордиреЗ рдЗрд╕реЗ (рдЬреЛ рдЗрддрдирд╛ рдордЬрдмреВрдд рд╣реЛ рднреА рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдирд╣реАрдВ рднреА) рдХреЛ рдкрджрд╛рд╡рдирдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд╡рд░реНрддрдорд╛рди (рдмрд╣рд┐рд╖реНрдХреГрдд) 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

рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ, рдорд▓реНрдЯреАрдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдкрд╣рд▓рд╛ рд╕реНрддрд░ рдЕрддрд┐рд╢реНрдпреЛрдХреНрддрд┐рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЙрд▓рдо рдХрд╛ рдирд╛рдо рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдУрдкреА рдореЗрдВ, рдпрд╣ рд╕реАрдзреЗ рдХреЙрд▓рдо рдХреЗ рдкрд╣рд▓реЗ рд╕реНрддрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рднреА рд╣реИ)ред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк gr.agg(['sum', 'mean']) рдпрд╛ (рдорд┐рд╢реНрд░рд┐рдд) gr.agg({'B': ['sum', 'mean'], 'C': {'c_mean': 'mean', 'c_count': 'count'}}) рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдорд▓реНрдЯреАрдЗрдВрдбреЗрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рддреЛ рдЙрдкрд░реЛрдХреНрдд рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдЕрдВрддрд┐рдо рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 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() ibis рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдпрд╣ рднреА рдЗрд╕реА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреИрд╕реЗ R рдореЗрдВ dplyr)
  • рдпрд╣ рд╕реАрдзреЗ рдЖрдкрдХреЛ рдЧреИрд░-рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдХреЙрд▓рдо рдирд╛рдо рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдХреЛрдИ рдорд▓реНрдЯреАрдЗрдВрдбреЗрдХреНрд╕ рдирд╣реАрдВ)
  • рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╢реНрд░реГрдВрдЦрд▓рд╛ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рднреА), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддрд╛рдирд╛рд╢рд╛рд╣реА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рд╣реИ

рд╣рдордиреЗ рдЕрднреА рднреА рдереЛрдбрд╝реА рдЪрд░реНрдЪрд╛ рдХреА рдереА рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдЬреЛ рдореИрдВрдиреЗ рдКрдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдерд╛ (рдореЗрд░реЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕рдордХрдХреНрд╖ рдХреЙрд▓рдо/рдлрд╝рдВрдХреНрд╢рди рдЪрдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП):

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

рдЖрдк рдЕрднреА рднреА рдЗрд╕ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рддрд╛рдирд╛рд╢рд╛рд╣реА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди (рдмрд╣рд┐рд╖реНрдХреГрдд) рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рд╕реНрддрд░ рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХреЗ рд╕рд╛рде:

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

(рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдореМрдЬреВрджрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдбрд┐рдХреНрдЯреНрд╕ рдХреЛ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ)

рд╣рд╛рд▓рд╛рдБрдХрд┐, рддрд╛рдирд╛рд╢рд╛рд╣реА рд╣рдореЗрд╢рд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛрддреА рд╣реИ {col: func} , рдФрд░ рд╡реЗ рдХрдИ рдПрдХрд▓ рддрддреНрд╡ dicts рдереЛрдбрд╝реЗ рдЕрдЬреАрдм рд▓рдЧрддреЗ рд╣реИрдВред рддреЛ рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЯреБрдкрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:

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

рдпрд╣ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░ {'B': 'sum'} dict рдЕрдиреНрдп рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИ рдЬрд┐рд╕ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реИред


рдКрдкрд░ рджрд┐рдП рдЧрдП рджреЛрдиреЛрдВ рд╕реБрдЭрд╛рд╡ (рдмрд╛рдж рдореЗрдВ рдЖрд╕рд╛рди рдирд╛рдордХрд░рдг, рдФрд░ рдХреАрд╡рд░реНрдб-рдЖрдзрд╛рд░рд┐рдд рдирд╛рдордХрд░рдг) рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреЛрдиреЛрдВ (рдпрд╛ рдЕрднреА рднреА рдЖрдЧреЗ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдФрд░) рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рджреЗрд╡реЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдпрд╣рд╛рдБ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рдореИрдВ рдкрд░рд┐рдгрд╛рдореА рдорд▓реНрдЯреАрдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдмрд╣рд┐рд╖реНрдХреГрдд рддрд╛рдирд╛рд╢рд╛рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреЗрд╡рд▓) рджреЛрд╖ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдЪрдкрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╣рд╛рдБ YAO :-/)ред

рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реВрдВ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ:

  • рдЪреАрдЬреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдирдкреИрдХ рдХрд░реЗрдВ ( **{} рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╛рдп рдкрд╛рдпрдерди!)
  • рдирд╛рдордХрд░рдг рдФрд░ рдПрдХрддреНрд░реАрдХрд░рдг рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдПрдХ рд╕рд╛рде рдмрдВрдж рд░рдЦреЗрдВ (рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдирд╛ рдЬреИрд╕реЗ рдХрд┐ рдЙрдирдХрд╛ рдЖрджреЗрд╢ рд╡рд╣реА рд░рд╣рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдПрдордПрдЪрдУ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реИ)
  • (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдореА рдпрд╛ рд╡рд┐рд░реЛрдз) рдлрд╝рдВрдХреНрд╢рди рдирд╛рдореЛрдВ рдХреЗ рдХрд╛рд░рдг рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд▓реИрдореНрдмреНрдбрд╛ рдпрд╛ рдЖрдВрд╢рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЬреИрд╕реЗ, рдЕрдВрддрд┐рдо рд╕реБрдЭрд╛рд╡ (col> func рдореИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП dicts рдпрд╛ tuples рдХреЗ рд╕рд╛рде) рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдкрд╣рд▓рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░ рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рджрд░реНрдж рдХреЗ рдХрд╛рд░рдг рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рджреЛ рд╕реВрдЪрд┐рдпрд╛рдБред

рдЖрдЬ рджреЗрд╡ рдмреИрдардХ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреАред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд╛рд░рд╛рдВрд╢

  1. @jorisvandenbossche gr.agg(b_sum=("B", "sum), ...) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛, рдЕрд░реНрдерд╛рдд рдЬрдм рдХреЛрдИ arg рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ *GroupBy.agg , рддреЛ kwargs рдХреЛ <output_name>=(<selection>, <aggfunc>) рд░реВрдк рдореЗрдВ рд╕рдордЭреЗрдВ
  2. рдУрд░реНрдереЛрдЧреЛрдирд▓ рдЗрд╕ рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ MutliIndex.flatten рдФрд░ рдПрдХ рдкреНрд░рджрд╛рди flatten=True рдХреАрд╡рд░реНрдб рдХреЛ .agg

рд╢рд╛рдпрдж рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ: рдкрджрд╛рд╡рдирддрд┐ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдпреЗ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдЙрдкрдирд╛рдо рдХреА рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВ-> 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() 
    }

рдореИрдВ рдпрд╣рд╛рдВ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЭрдВрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдПрдХ рдХреЙрд▓рдо рдХреЛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рддреБрд░рдВрдд рдЙрд╕реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ _never_ рдкрд╛рдВрдбрд╛ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд▓реНрдЯреАрдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреБрдж рдХреЛ рдорд┐рд▓рд╛ рд╣реИ - рдореИрдВ рдпрд╛ рддреЛ рдЗрд╕реЗ рддреБрд░рдВрдд рдлрд╝реНрд▓реИрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорддрд▓рдм рд╣реИред

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рд╕реА рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЦреБрд╢реА рд╣реЛрдЧреА: рдПрд╕рдХреНрдпреВрдПрд▓-рдЬреИрд╕реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ (рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреБрдж рдХреЛ .query() рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рдВрдбрд╛ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд╛рддрд╛ рд╣реВрдВ), рдореВрд▓реНрдпрд╣реНрд░рд╛рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рд╡рд╛рдкрд╕, рдЕрдиреНрдп рд╕реБрдЭрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреАред рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдиреЗ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрди рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рд╕реЗ рдЙрдкрд╣рд╛рд╕ рдХрд┐рдпрд╛ рдЬреЛ рдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЦреБрдж рдХреЛ рдкрдВрдбреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрд╛рдпрд╛, рднрд▓реЗ рд╣реА рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдерд╛, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореБрдЭреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ:

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкрд╛рдВрдбрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╕рд╛рдл рджрд┐рдЦрддрд╛ рд╣реИ! рддреЛ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдкрд░ рдХрд╛рдо рдЕрднреА рднреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ :-)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рдордд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ; рд╣рдореЗрдВ рдХрд┐рд╕реА рдХреА рдЬрд░реВрд░рдд рд╣реИ
рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЛред

рдмреБрдзрд╡рд╛рд░ 27 рдорд╛рд░реНрдЪ 2019 рдХреЛ рд╕реБрдмрд╣ 9:01 рдмрдЬреЗ рдереЙрдорд╕ рдХрд╕реНрддрд▓ рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдореИрдВ рдпрд╣рд╛рдВ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЭрдВрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ
рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрд▓рдо рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЧреБрдо рд╣реИ рдФрд░
рддреБрд░рдВрдд рдЙрд╕реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ред рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдХрднреА рдирд╣реАрдВ рдкрд╛рдпрд╛
рдкрд╛рдВрдбрд╛ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд▓реНрдЯреАрдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ - рдореИрдВ рдпрд╛ рддреЛ рдЗрд╕реЗ рддреБрд░рдВрдд рдлрд╝реНрд▓реИрдЯ рдХрд░рддрд╛ рд╣реВрдВ,
рдпрд╛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдорддрд▓рдм рд╣реИред

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рд╕реА рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЦреБрд╢реА рд╣реЛрдЧреА: SQL рдЬреИрд╕рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕
(рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреБрдж рдХреЛ .query() рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рдВрдбрд╛ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд╛рддрд╛ рд╣реВрдВ),
рдореВрд▓реНрдпрд╣реНрд░рд╛рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛, рдЕрдиреНрдп рд╕реБрдЭрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреАред
рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдиреЗ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрди рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рд╕реЗ рдЙрдкрд╣рд╛рд╕ рдХрд┐рдпрд╛ рдЬреЛ рдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЦреБрдж рдХреЛ рдкрдВрдбреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рднреА рдкрд╛рдпрд╛ рд╣реИ
рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдерд╛, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореБрдЭреЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ:

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкрдВрдбреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ,
рдпрд╣ рдмрд╕ рдЗрддрдирд╛ рд╕рд╛рдл рджрд┐рдЦрддрд╛ рд╣реИ! рддреЛ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдХрд╛рдо рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ
рдпрд╣ рдЕрднреА рднреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ :-)

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ 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 рдкрд░ рдПрдХ рдкреАрдЖрд░ рдбрд╛рд▓рд╛ рд╣реИ **kwargs рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╛рдо рдмрджрд▓реЗрдВ рдФрд░ рд╕реНрддрдВрдн-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рдЗрд╕ рдорд┐рд╢реНрд░рдг рдХреЛ рдЗрд╕ рд╕рдордЭ рдХреЗ рд╕рд╛рде рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ рдХрд┐ рдорд╛рди (selection, aggfunc) рдЯреБрдкрд▓реНрд╕ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

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=... рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)
  • рдЖрдЙрдЯрдкреБрдЯ рдирд╛рдореЛрдВ рдХреА рд╡рд░реНрддрдиреА рдЬреЛ рдЕрдЬрдЧрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИрдВ рдмрджрд╕реВрд░рдд рд╣реИ: .agg(**{'output name': (col, func)})
  • рдпрд╣ рдХреЗрд╡рд▓ рдкрд╛рдпрдерди 3.6+ рд╣реИ, рдпрд╛ рд╣рдореЗрдВ 3.5 рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдХреБрдЫ рдмрджрд╕реВрд░рдд рд╣реИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ **kwargs рдХрд╛ рдСрд░реНрдбрд░ рдкрд╣рд▓реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдерд╛
  • aggfunc рдХреЛ рдПрдХ рдпреВрдирд░реА рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдХреЗ рдХрд╕реНрдЯрдо aggfunc рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИ, рдПрдХ рд╣реА рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ lambda aggfuncs рдЕрднреА рддрдХ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рдкрджрд╛рд╡рдирдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдорд░реНрдердХ рд╣реЛрдВрдЧреЗред рд▓реЛрдЧ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

cc @WillAyd рдЕрдЧрд░ рдореБрдЭреЗ рдЖрдкрдХреА рдХреЛрдИ рдЪрд┐рдВрддрд╛ рдпрд╛рдж рдЖрддреА рд╣реИред

рд╣рд╛рдп @TomAugspurger ,

рдЗрд╕ рдХрджрдо рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕рдХреА рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ

  • рдпрд╣ рдмрд╛рдХреА рдкрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рдЕрдЬреАрдм рд╣реИред sytanx (output_name=(selection, aggfunc)) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ .assign output_name=... рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)

рдореИрдВ рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд▓реЗрдХрд┐рди рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рддрд░реНрдХ рдЙрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рди рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдмрд╣рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред

рдХреНрдпрд╛ рдЖрдк рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдкреБрд░рд╛рдиреЗ _рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рддрд░реНрдХ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЗрд╕ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рдХреНрдпреЛрдВ рд╣реИрдВ?

рдПрдХ рд▓рд╛рдн рдЬреЛ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╕реЛрдЪ рд╕рдХрддрд╛ рдерд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ (py3.6+ рдХреЗ рд▓рд┐рдП) рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрд▓рдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдСрд░реНрдбрд░ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  • рдЖрдЙрдЯрдкреБрдЯ рдирд╛рдореЛрдВ рдХреА рд╡рд░реНрддрдиреА рдЬреЛ рдЕрдЬрдЧрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИрдВ рдмрджрд╕реВрд░рдд рд╣реИ: .agg(**{'output name': (col, func)})

рд╡реИрд╕реЗ рддреЛ рдкреБрд░рд╛рдирд╛ рддрд░реАрдХрд╛ рдЙрд╕ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ рдмреЗрд╣рддрд░ рдерд╛ред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рдЬрдм рддрдХ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдПрдХрддреНрд░реАрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП **{...} рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдореБрдЭреЗ рдХрд╛рдлреА рдЦреБрд╢реА рд╣реЛрдЧреАред

  • рдпрд╣ рдХреЗрд╡рд▓ рдкрд╛рдпрдерди 3.6+ рд╣реИ, рдпрд╛ рд╣рдореЗрдВ 3.5 рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдХреБрдЫ рдмрджрд╕реВрд░рдд рд╣реИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ **kwargs рдХрд╛ рдСрд░реНрдбрд░ рдкрд╣рд▓реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдерд╛

рдпрд╣ рдкрд╣рд▓реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ (рдореМрдЬреВрджрд╛ рддрд╛рдирд╛рд╢рд╛рд╣реА рд╕реБрд╡рд┐рдзрд╛)? рдХреНрдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЖрджреЗрд╢ рдХреА рдЧрд╛рд░рдВрдЯреА рдереА?

  • aggfunc рдХреЛ рдПрдХ рдпреВрдирд░реА рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдХреЗ рдХрд╕реНрдЯрдо aggfunc рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

рдмрд╕ рдореЗрд░реА рд╕рдордЭ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: aggfunc рдХреЛрдИ рднреА рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡реИрдз рдорд╛рди рджреЗрддрд╛ рд╣реИ? ("рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА" рд╕реНрдЯреНрд░рд┐рдВрдЧ aggfungs рдХреЗ рдЕрд▓рд╛рд╡рд╛ 'min' , 'max' , рдЖрджрд┐)ред рдХреНрдпрд╛ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рд╣реИ? (рдпрд╛рдиреА рдпреВрдирд░реА рд╕реАрдорд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рдереА?)

рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИ, рдПрдХ рд╣реА рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ lambda aggfuncs рдЕрднреА рддрдХ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рдБ, рдпрд╣ рдПрдХ рддрд░рд╣ рдХрд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕реАрдорд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рдкрджрд╛рд╡рдирдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдорд░реНрдердХ рд╣реЛрдВрдЧреЗред рд▓реЛрдЧ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

рдЦреИрд░, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЪрд░рдг рдореЗрдВ рдХреБрд▓ рдФрд░ рдирд╛рдо рдмрджрд▓рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрджрд┐ рдкреБрд░рд╛рдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рддрд░реНрдХ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкреБрд░рд╛рдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рдХреНрдпреЛрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдореИрдВ рд╢рд╛рдпрдж рдЧрд▓рдд рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ SeriesGroupby.agg рдФрд░ DataFrameGroupby.agg рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдмрд╛рд╣рд░реА рдХреБрдВрдЬреА рдХреЗ рдмреАрдЪ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рд╣реИрдВ (рдХреНрдпрд╛ рдпрд╣ рдХреЙрд▓рдо рдЪрдпрди рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдирд╛рдордХрд░рдг рд╣реИ?) рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде, рд╣рдо рд▓рдЧрд╛рддрд╛рд░ рдХреАрд╡рд░реНрдб рдХрд╛ рдорддрд▓рдм рдЖрдЙрдЯрдкреБрдЯ рдирд╛рдо рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╡реИрд╕реЗ рддреЛ рдкреБрд░рд╛рдирд╛ рддрд░реАрдХрд╛ рдЙрд╕ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ рдмреЗрд╣рддрд░ рдерд╛ред

рдХреНрдпрд╛ рдЕрдВрддрд░ рд╕рд┐рд░реНрдл ** ? рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рди рд╕реАрдорд╛рдПрдВ рд╕рд╛рдЭрд╛ рдХреА рдЬрд╛рддреА рд╣реИрдВред

рдпрд╣ рдкрд╣рд▓реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ (рдореМрдЬреВрджрд╛ рддрд╛рдирд╛рд╢рд╛рд╣реА рд╕реБрд╡рд┐рдзрд╛)? рдХреНрдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЖрджреЗрд╢ рдХреА рдЧрд╛рд░рдВрдЯреА рдереА?

рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЛ рдЫрд╛рдВрдЯрдирд╛, рдЬреЛ рдХрд┐ рдореИрдВ рдЕрдм рдкреАрдЖрд░ рдореЗрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдмрд╕ рдореЗрд░реА рд╕рдордЭ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

marcelnem picture marcelnem  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amelio-vazquez-reina picture amelio-vazquez-reina  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BDannowitz picture BDannowitz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tade0726 picture tade0726  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jaradc picture jaradc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ