Python Pandas:分组按和平均、计数、中位数

时间:2021-07-22 21:31:24

标签: 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)

现在假设我想创建一个新的数据框,它取时间的平均值和中位数,获取用户状态,并生成一个新列来计算用户在 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)

我知道我可以通过这样的平均语句来做一个小组

df.groupby(['User'], as_index=False).mean().groupby('User')['time'].mean()

这给了我一个 Pandas 系列,如果我愿意,我想我可以把它变成一个数据框,但是我如何为我感兴趣的所有其他列做上面的后者?

2 个答案:

答案 0 :(得分:4)

尝试使用 pd.NamedAgg

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

输出:

  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

答案 1 :(得分:2)

您甚至可以以字典的形式为列传递多个聚合函数,如下所示:

out = df.groupby('User').agg({'time': [np.mean, np.median], 'state':['first']})

     time        state
     mean median first
User                  
A     1.5    1.5    CA
B     3.0    3.0    ID
C     4.0    4.0    OR

它提供了多级列,您可以删除级别或加入它们:

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

      time_mean  time_median state_first
User                                    
A           1.5          1.5          CA
B           3.0          3.0          ID
C           4.0          4.0          OR
相关问题