Python 通过df获取一个新列,其中包含组_中特定范围内所有值的总计数

Python 通过df获取一个新列,其中包含组_中特定范围内所有值的总计数,python,pandas,Python,Pandas,按“u_id”分组的现有数据帧 需要有一个新的列来记录每行中某个范围(例如7-12、7包括、12排除)之间的“u_点”总数。因此,新的数据帧看起来是这样的: u_id u_name u_points u_range_(7-12) 1 AA 12 1 1 AA 8 1 1 AA 5

按“u_id”分组的现有数据帧

需要有一个新的列来记录每行中某个范围(例如7-12、7包括、12排除)之间的“u_点”总数。因此,新的数据帧看起来是这样的:

u_id  u_name   u_points     u_range_(7-12)
   1      AA         12                  1 
   1      AA         8                   1
   1      AA         5                   1
   2      BC         15                  3
   2      BC         9                   3
   2      BC         10                  3
   2      BC         6                   3
   2      BC         8                   3

我尝试使用count(),但我可以得到一个只有这些索引值的序列,但我需要所有行的输出。也尝试了转换,但在条件“介于”之间时它不起作用。

=
创建掩码,为
&
按位
创建链,为
创建掩码,我找到了一种“低努力方式”来实现相同的结果

df["u_range_(7-12)"] = pd.Series(np.where(df.u_points.between(7,12-1).values, 1,0)).groupby(df2['u_id']).transform('sum')
因为我是熊猫队的新手,我个人觉得这更可取,因为它使用的是“熟悉”的操作,而不是其他写得很好的答案

m = df['u_points'].ge(7) & df['u_points'].lt(12)

df['u_range_(7-12)'] = m.view('i1').groupby(df['u_name']).transform('sum')
#alternative
#df['u_range_(7-12)'] = m.astype('int').groupby(df['u_name']).transform('sum')
print (df)
   u_id u_name  u_points  u_range_(7-12)
0     1     AA        12               1
1     1     AA         8               1
2     1     AA         5               1
3     2     BC        15               3
4     2     BC         9               3
5     2     BC        10               3
6     2     BC         6               3
7     2     BC         8               3
m = df['u_points'].ge(7) & df['u_points'].lt(12)

df['u_range_(7-12)'] = df.assign(m = m.astype('int')).groupby('u_name')['m'].transform('sum')
print (df)
   u_id u_name  u_points  u_range_(7-12)
0     1     AA        12               1
1     1     AA         8               1
2     1     AA         5               1
3     2     BC        15               3
4     2     BC         9               3
5     2     BC        10               3
6     2     BC         6               3
7     2     BC         8               3
df.merge(df[df['u_points'].between(7,12-1)].groupby('u_id').size().to_frame(name='u_range_(7-12)').reset_index(),
         on='u_id')
df["u_range_(7-12)"] = pd.Series(np.where(df.u_points.between(7,12-1).values, 1,0)).groupby(df2['u_id']).transform('sum')