作者:小啊小二饼(iconfont)

🌑

Spaghetti.ink

Appreciation, Modesty, Persistence


【毕设专栏-3】用户识别

用户识别

顾名思义,用户识别,就是将每条记录按照用户分组。我们将一组有顺序的,同一个用户的访问序列视为一次会话。根据需要,我们将相同IP以及代理的记录视为一个用户的唯一标识。

import pandas as pd;
import os;

# 读取文件
outputPath = os.path.join(os.getcwd(), 'log', 'logs_handled');
logs = pd.read_pickle(outputPath);

# 根据IP和Proxy(User-Agent)字段进行分组
user_groups = logs.groupby(['IP', 'Proxy'])

通过Pandas的API,我们可以轻松的根据指定字段进行分组,返回一个groupby对象,一下为其常用的方法

# 返回所有分组
user_groups.groups
# 返回所有分组的索引
user_groups.indices

现在我们就取一个索引看看我们的分组是怎样的

user_groups.get_group(('1.1.18.22', 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'))

group
观察到我们的分组是正确的,那么接下来我们给每一条记录打上我的Uid标签
user_id = 0;

def labelUserId(df):
    global user_id;
    user_id += 1;
    df['Uid'] = user_id;
    return df;

new_groups = user_groups.apply(labelUserId);

通过简单的apply方法即可给每一个记录都打上Uid标签。
其中要注意的是,调用一个groupby对象的apply方法,我们通过参数获取到的变量是一个dataframe
上方代码中,其实我是直接给dataframe新增了一列。当然你也可以通过调用每一个dataframapply方法来给每一条记录新增一个字段,但是显然这么做的效率要比直接给一个块(dataframe)新增一列低的多。
user_id = 0;
def labelRow(row):
    global user_id;
    row['Uid'] = user_id;
    return row;

def labelUserId(df):
    global user_id;
    user_id += 1;
    return df.apply(labelRow, axis=1);

new_groups = user_groups.apply(labelUserId);

处理结果

result

本文由 Frank采用 署名 4.0 国际 (CC BY 4.0)许可

, — 2021年3月30日

本文总阅读量


本站总访问量