看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在用户行为分析或安全审计场景中,识别异常登录(如短时间内多次登录)和统计高频活跃用户是关键任务。这类分析有助于发现潜在的账户盗用、自动化脚本攻击或核心用户群体。本文将通过一个模拟的用户登录日志数据集,演示如何结合 pandas 的 value_counts、between_time 和 pipe 方法,高效筛选可疑行为并量化用户活跃度。学完本案例,你将掌握如何用简洁的链式操作完成时间窗口过滤与频次统计。
我们有如下用户登录记录(包含用户 ID 和登录时间):
import pandas as pd
from io import StringIO
data = """
user_id,login_time
201,2025-03-01 02:15:00
202,2025-03-01 08:30:00
201,2025-03-01 02:16:00
203,2025-03-01 14:45:00
201,2025-03-01 02:17:00
204,2025-03-01 23:50:00
202,2025-03-02 09:00:00
201,2025-03-02 10:00:00
205,2025-03-01 03:00:00
"""
df = pd.read_csv(StringIO(data))
df['login_time'] = pd.to_datetime(df['login_time'])
df = df.set_index('login_time') # 将时间设为索引,便于时间切片
需求描述:
正确结果应为:
201 → 3。首先利用 between_time 方法快速筛选出凌晨时段的登录记录(前提是时间列为 DatetimeIndex)。然后使用 value_counts() 统计各用户的出现频次,该方法天然按频次降序排列。最后通过 query() 或布尔索引保留登录次数 ≥2 的用户。整个流程可链式完成,无需中间变量,逻辑清晰且性能良好。
代码如下:
frequent_night_users = (
df
.between_time('00:00', '05:00') # 筛选凌晨 0–5 点的登录
['user_id'] # 只保留 user_id 列
.value_counts() # 统计每个用户的登录次数(自动降序)
.pipe(lambda s: s[s >= 2]) # 筛选登录次数 ≥2 的用户
)
print(frequent_night_users)
代码分析:
between_time('00:00', '05:00') 是处理时间索引数据的强大工具,专用于按一天中的时间段过滤;['user_id'] 提取列后得到一个 Series,为后续 value_counts() 做准备;value_counts() 不仅计数,还默认按频次从高到低排序,省去额外排序步骤;.pipe(lambda s: s[s >= 2]) 实现条件过滤,保持链式风格(也可替换为 .loc[lambda x: x >= 2]);这段代码展示了 pandas 在时间序列筛选与频次分析中的优雅组合,适用于安全监控、用户画像等多种实际场景。
(完)
更新时间:2025-11-19 22:03:36 标签:pandas python 异常登录 高频用户