Python用pandas groupby查找多用户IP结果包含单用户IP求助
问题原因
- 你当前的统计逻辑和需求不匹配,是导致结果错误的核心原因:
- 你按
IP地址+日期分组后用count()统计的是用户名的记录条数,同一个用户同一天多次登录也会被计数≥2,此时你会误将这类仅关联单个用户的IP纳入筛选范围 - 你的需求是查找关联多个不同用户名的IP,原有逻辑完全没有对用户名去重,也没有按IP维度做全局的用户名数量统计
- 你按
正确实现代码
场景1:直接输出「IP-对应关联用户名列表」的结果
# 按IP分组,同时统计去重用户名数量、收集所有去重后的用户名 ip_user_mapping = df.groupby('IP address')['Username'].agg( 关联用户数='nunique', 关联用户名列表=lambda x: list(x.unique()) ).reset_index() # 筛选出关联≥2个不同用户的IP result = ip_user_mapping[ip_user_mapping['关联用户数'] >= 2] # 可直接导出结果 result.to_excel('多用户关联IP清单.xlsx', index=False)
场景2:需要保留符合条件的IP对应的所有原始日志记录
在上述代码基础上追加以下逻辑即可:
# 提取符合条件的IP列表 target_ips = result['IP address'].tolist() # 从原始DataFrame中筛选对应IP的全量记录 filtered_logs = df[df['IP address'].isin(target_ips)] # 导出原始日志 filtered_logs.to_excel('多用户关联IP全量日志.xlsx', index=False)
特殊场景适配
如果你的实际需求是「查找同一天内出现多个不同用户名的IP」,调整分组逻辑即可:
# 按IP+日期分组,统计单日去重用户名数量 ip_date_stat = df.groupby(['IP address', 'Date'])['Username'].nunique().reset_index(name='当日关联用户数') # 筛选单日关联≥2个用户的IP并去重 target_ips = ip_date_stat[ip_date_stat['当日关联用户数'] >= 2]['IP address'].unique().tolist() # 后续筛选原始数据的逻辑和上面一致
内容的提问来源于stack exchange,提问作者George Papadopoulos
相关产品推荐
相关产品推荐

