假设我有一个像这样的数据框
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 系列,如果我愿意,我想我可以把它变成一个数据框,但是我如何为我感兴趣的所有其他列做上面的后者?
答案 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