Python Pandas:分组依据和平均值、计数、中位数

jus*_*ewb 1 python pandas

假设我有一个看起来像这样的数据框

d = {'User' : ['A', 'A', 'B', 'C', 'C', 'C'],
     'time':[1,2,3,4,4,4],
     'state':['CA', 'CA', 'ID', 'OR','OR','OR']}
df = pd.DataFrame(data = d)
Run Code Online (Sandbox Code Playgroud)

现在假设我想创建新的数据帧,它采用时间的平均值和中位数,获取用户状态,并生成一个新列来计算用户出现在该列中的次数User,即

d = {'User' : ['A', 'B', 'C'],
     'avg_time':[1.5,3,4],
     'median_time':[1.5,3,4],
     'state':['CA','ID','OR'],
     'user_count':[2,1,3]}

df_res = pd.DataFrame(data=d)
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过这样的平均陈述来建立一个小组

df.groupby(['User'], as_index=False).mean().groupby('User')['time'].mean()
Run Code Online (Sandbox Code Playgroud)

这给了我一个 pandas 系列,我想如果我愿意的话我可以将其制作成一个数据框,但是我将如何为我感兴趣的所有其他列做上面的后者呢?

Sco*_*ton 7

尝试使用pd.NamedAgg

df.groupby('User').agg(avg_time=('time','mean'),
                       mean_time=('time','median'),
                       state=('state','first'),
                       user_count=('time','count')).reset_index()
Run Code Online (Sandbox Code Playgroud)

输出:

  User  avg_time  mean_time state  user_count
0    A       1.5        1.5    CA           2
1    B       3.0        3.0    ID           1
2    C       4.0        4.0    OR           3
Run Code Online (Sandbox Code Playgroud)