Python DataFrame GroupBay или Pivot_table

В Java 7+ вы можете сделать это в статическом методе / полях:

MethodHandles.lookup().lookupClass()
1
задан YilGuk Seo 19 March 2019 в 14:25
поделиться

2 ответа

Вам может понадобиться groupby два раза, затем join результат назад

s=df.groupby(['id','year']).agg({'avg':'mean','sum':'sum','div':lambda x : x.iloc[0]/x.iloc[1]})
s=s.unstack()# here is reshape 
s.columns=s.columns.map('{0[1]}_{0[0]}'.format) # here is flatten the multiple index 
s
Out[723]:
     2011_avg  2012_avg  2011_sum  2012_sum  2011_div  2012_div
id
101     0.450     0.250         3         5       2.0       1.5
102     0.505     0.305        12        17       6.0       2.0

s2=df.groupby(['id']).agg({'sum':'sum','div':lambda x : x.iloc[0]/x.iloc[1]})

Finaldf=s2.join(s)# join back 

Finaldf
Out[729]: 
     sum  div  2011_avg    ...     2012_sum  2011_div  2012_div
id                         ...                                 
101    8    2     0.450    ...            5       2.0       1.5
102   29    6     0.505    ...           17       6.0       2.0
[2 rows x 8 columns]
0
ответ дан Wen-Ben 19 March 2019 в 14:25
поделиться

Я попытался просто сделать 2 groupbys и затем объединить оба результата. Просто для соглашений об именах я использовал pivot_table.

df2 = df.groupby(by=["id","year"]).agg({
    "avg": np.median,
    "sum": np.sum,
    "div": lambda x : x.iloc[0]/x.iloc[1]
}).reset_index().pivot_table(values=["avg","sum","div"],columns=["year"],index=["id"]).reset_index()
df2.columns = [str(col[1])+"_"+col[0] if col[1] != "" else col[0] for col in df2.columns.values ]
df2.merge(df.groupby(by=["id"]).agg({
    "avg": np.median,
    "div": lambda x : x.iloc[0]/x.iloc[1],
    "sum": np.sum
}), on="id")
0
ответ дан katbarahona 19 March 2019 в 14:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: