groupby.agg
рдореЗрдВ рдбрд┐рдХреНрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╣рд┐рд╖реНрдХрд░рдг рдХреЗ рдмрд╛рдж #15931 рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдиреАрдЪреЗ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдкрд░ рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИред рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ https://github.com/pandas-dev/pandas/pull/15931#issuecomment -336139085 рдЬрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рдИ рдЧрдИ рд╣реИрдВред
#15931 рдХреЗ рдкрджрд╛рд╡рдирддрд┐ рдХреЗ рдкреАрдЫреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдФрд░ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдХреЗ рдмреАрдЪ agg()
рд▓рд┐рдП рдПрдХ рд╕реБрд╕рдВрдЧрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдереА (рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП #14668 рднреА рджреЗрдЦреЗрдВ)ред
рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рддрд╛рдирд╛рд╢рд╛рд╣реА рдХреЗ рд╕рд╛рде рдкреБрди: рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдФрд░/рдпрд╛ рдЕрд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдХреАрдордд рдкрд░ рдЖрддрд╛ рд╣реИ: рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреБрд▓ рдФрд░ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рдореБрджреНрджреЛрдВ рдФрд░ рдХреБрдЫ рдкрд┐рдЫрдбрд╝реЗ рдЕрд╕рдВрдЧрддрд┐ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдИ рд╕рдордЭрджрд╛рд░ рд╕рдорд╛рдзрд╛рди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ:
__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
рд╕реНрдерд┐рд░ рдХреЗ рд╕рд╛рде
рдЕрд▓рдЧ рдЪрд░рдг рдореЗрдВ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдПред
рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдореВрд▓ рдХреЙрд▓рдо рдирд╛рдо рдФрд░ _рдПрдЧреНрд░реАрдЧреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо_ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреБрдЫ рд╕рдВрдпреЛрдЬрди рд╣реИ:
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 рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рддрд╛рдирд╛рд╢рд╛рд╣реА рдПрдкреАрдЖрдИ рдХрдИ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдФрд░ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреНрдпреЛрдВ рдерд╛ред
(* рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рддрд╛рдирд╛рд╢рд╛рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрдЯрд┐рд▓ рд╣реИред)
@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 рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдЯреАрдПрд▓; рдбреАрдЖрд░ рдХреГрдкрдпрд╛ рдореВрд▓реНрдпрд╣реНрд░рд╛рд╕ рди рдХрд░реЗрдВред :)
рдореЗрд░рд╛ рдпреЛрдЧрджрд╛рди рджреЛ рдЪреАрдЬреЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╛рдВрдбрд╕ рд╕реАрд░реАрдЬрд╝ рдФрд░ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП 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)
ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдбреЗрдХреНрд╕рдкреНрд▓реЛ рдЧреНрд░реБрдкрдмрд╛рдп рдПрдЧреНрд░реАрдЧреЗрд╢рди рдХрд░рддрд╛ рд╣реИред
@zertrin рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдкрд░реЛрдХреНрдд рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ: https://github.com/pandas-dev/pandas/issues/18366/#issuecomment -349089667
рдЕрдВрдд рдореЗрдВ, рдпрд╣ рддрд╛рдирд╛рд╢рд╛рд╣реА рдХреЗ рдХреНрд░рдо рдХреЛ рдЙрд▓рдЯ рджреЗрддрд╛ рд╣реИ: "{col: {name: func}}" рдХреЗ рдмрдЬрд╛рдп рдпрд╣ "**{name: {col: func}}" рдЬреИрд╕рд╛ рд╣реЛрдЧрд╛ред
@jorisvandenbossche рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рд╡рд░реНрддрдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдХреНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн рд▓рд╛рддрд╛ рд╣реИред
рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЧрдП рд╣реИрдВ:
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ 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 рдХреЗ рд╕рд╛рде) рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред
рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдкрд╣рд▓рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░ рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рджрд░реНрдж рдХреЗ рдХрд╛рд░рдг рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рджреЛ рд╕реВрдЪрд┐рдпрд╛рдБред
рдЖрдЬ рджреЗрд╡ рдмреИрдардХ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреАред
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд╛рд░рд╛рдВрд╢
gr.agg(b_sum=("B", "sum), ...)
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛, рдЕрд░реНрдерд╛рдд рдЬрдм рдХреЛрдИ arg
рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ *GroupBy.agg
, рддреЛ kwargs рдХреЛ <output_name>=(<selection>, <aggfunc>)
рд░реВрдк рдореЗрдВ рд╕рдордЭреЗрдВ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
рдЗрд╕рдХреА рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ
(output_name=(selection, aggfunc))
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ .assign
output_name=...
рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ).agg(**{'output name': (col, func)})
**kwargs
рдХрд╛ рдСрд░реНрдбрд░ рдкрд╣рд▓реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдерд╛рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИ, рдПрдХ рд╣реА рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдПрдХрд╛рдзрд┐рдХ 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')
ред
рдареАрдХ рд╣реИ рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг ЁЯСН рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╣реИ (рдФрд░ рдЬреИрд╕реЗ рд╣реА рдПрдХрд╛рдзрд┐рдХ рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реАрдорд╛ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдареАрдХ рд░рд╣реЗрдЧрд╛)
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдореИрдВ рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХрдо рди рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВред
рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдЗрдерди рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо-рд╕реНрдерд╛рди (рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЛ рдХреЙрд▓рдо рдирд╛рдореЛрдВ (рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЧрд╣рд░рд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо
'<lambda>'
рдирд╛рдо рдХреЗ рдХреЙрд▓рдо (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рдХреЙрд▓рдо) рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдореБрдЭреЗ рдЧрдВрднреАрд░ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдЕрд╕рдВрдЧрддрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИредрдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдордзреНрдпрд╕реНрде рдХрджрдо рд╣реИ рдЬрд╣рд╛рдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ (рдФрд░ рдЙрдЬрд╛рдЧрд░) рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЛ рдЗрдзрд░-рдЙрдзрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдиреНрд╣реЗрдВ рдордЬрд╝рдмреВрддреА рд╕реЗ, рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рдирд╛рдо рдмрджрд▓рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдиреЗрд╕реНрдЯреЗрдб dict рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдЯреАрдПрд▓; рдбреАрдЖрд░ рдХреГрдкрдпрд╛ рдореВрд▓реНрдпрд╣реНрд░рд╛рд╕ рди рдХрд░реЗрдВред :)