如何用Pandas从DataFrame生成三类组与用户统计报表?
Pandas 生成用户组三类报表解决方案
先构造一个贴近场景的示例DataFrame(你可以替换成自己的真实数据结构):
import pandas as pd data = { "组名": ["组1", "组1", "组2", "组3", "组4"], "用户": ["张三", "李四", "王五", "赵六", None], "角色": ["A", "U", None, "U", None] } df = pd.DataFrame(data)
1. 无管理员的组列表
核心逻辑:找出所有组中,从未出现过角色为"A"(管理员)的组。
# 提取所有有管理员的组 admin_groups = df[df["角色"] == "A"]["组名"].unique() # 从所有组中排除有管理员的组 no_admin_groups = df[~df["组名"].isin(admin_groups)]["组名"].unique() # 生成报表 no_admin_report = pd.DataFrame({"无管理员的组": no_admin_groups}) print(no_admin_report)
或者用groupby更简洁:
group_has_admin = df.groupby("组名")["角色"].apply(lambda x: (x == "A").any()) no_admin_groups = group_has_admin[~group_has_admin].index.to_list()
2. 既无管理员也无成员的组列表
核心逻辑:组内既没有管理员("A"),也没有普通成员("U"),通常对应只有空记录的组。
# 按组统计是否有管理员、是否有成员 group_stats = df.groupby("组名").agg( 有管理员=("角色", lambda x: (x == "A").any()), 有成员=("角色", lambda x: (x == "U").any()) ).fillna(False) # 空组默认统计为False # 筛选符合条件的组 no_admin_no_member_groups = group_stats[ (~group_stats["有管理员"]) & (~group_stats["有成员"]) ].index.to_list() # 生成报表 no_admin_no_member_report = pd.DataFrame({"既无管理员也无成员的组": no_admin_no_member_groups}) print(no_admin_no_member_report)
3. 未加入任何组的用户列表
核心逻辑:需要先有全量用户集合,再排除所有在DataFrame中出现过的用户(已加入组的用户)。
# 替换为你的系统全量用户列表 all_users = ["张三", "李四", "王五", "赵六", "孙七", "周八"] # 提取已加入组的非空用户 joined_users = df["用户"].dropna().unique() # 计算未加入任何组的用户 no_group_users = [user for user in all_users if user not in joined_users] # 生成报表 no_group_report = pd.DataFrame({"未加入任何组的用户": no_group_users}) print(no_group_report)
如果你的DataFrame是宽表结构(比如每行是用户,列是组和角色),可以先用pd.melt转成长表后再套用上面的逻辑:
# 宽表转长表示例 wide_df = pd.DataFrame({ "用户": ["张三", "李四", "王五"], "组1": ["A", "U", None], "组2": [None, None, "U"] }) long_df = wide_df.melt(id_vars="用户", var_name="组名", value_name="角色").dropna()
内容的提问来源于stack exchange,提问作者Dinerz
相关产品推荐
相关产品推荐

