我有一个 Pandas 数据框,其中包含用户信息,并且还有一列有关其权限的信息:
UserName Permissions
John Doe 02
John Doe 11
Example 09
Example 08
User3 11
我正在尝试创建一个名为的新列,User Class
该列基于他们的权限(查看所有用户权限)。 如果用户拥有所有权限 <10,则将其视为Admin
。 如果用户拥有所有权限 >=10,则将其视为User
。 但是,如果他们拥有的权限同时 <10 和 >=10,则他们将被编码为Admin/User
。 因此,我的结果输出将是:
UserName Permissions User Class
John Doe 02 Admin/User
John Doe 11 Admin/User
Example 09 Admin
Example 08 Admin
User3 11 User
最好的方法是什么? 我最初的想法是:
for UserName, User_df in df.groupby(by='UserName'):
LT10 = (User_df['Permissions'] < 10).any()
GTE10 = (User_df['Permissions'] >= 10).any()
if (LT10 & GTE10):
UserClass = 'Admin/User'
elif LT10:
UserClass = 'Admin'
elif GTE10:
UserClass = 'User'
df.at[User_df.index, 'User Class'] = UserClass
然而这些似乎非常低效因为df
有~800K条记录
按用户名分组并用来
transform
计算每个组的最小/最大权限值。然后使用它来User Class
计算np.select
:输出:
另一个可能的解决方案:
输出:
我将使用
pandas.cut
将值映射到管理员/用户并groupby.transform
组合类:输出: