
在用户行为分析中,一个常见的需求是识别用户在某个观察期(例如“后时期”)内首次访问的实体(例如“零售商”),而这些实体在之前的时期(例如“前时期”)中并未被访问过。这需要我们针对每个用户,对比其在前、后两个时期内的行为记录,并生成一个指示性的条件列。
假设我们拥有两张数据表,分别记录了用户在前时期和后时期访问的零售商信息。我们的目标是找出在后时期中,对于每个用户而言,哪些零售商是“新”的,即这些零售商在后时期被访问,但在前时期从未被该用户访问过。
以下是示例数据:
import pandas as pd
# 前时期用户访问零售商数据
sample1 = pd.DataFrame(
{
'user_id': [45, 556, 556, 556, 556, 556, 556, 1344, 1588, 2063, 2063, 2063, 2673, 2982, 2982],
'retailer': ['retailer_1', 'retailer_1', 'retailer_2', 'retailer_3', 'retailer_4', 'retailer_5', 'retailer_6',
'retailer_3', 'retailer_2', 'retailer_2', 'retailer_3', 'retailer_7', 'retailer_1', 'retailer_1', 'retailer_2']
}
)
# 后时期用户访问零售商数据
sample2 = pd.DataFrame(
{
'user_id': [45, 45, 556, 556, 556, 556, 556, 556, 1344, 1588, 2063, 2063, 2063, 2673, 2673, 2982, 2982],
'retailer': ['retailer_1', 'retailer_6', 'retailer_1', 'retailer_2', 'retailer_3', 'retailer_4', 'retailer_5', 'retailer_6',
'retailer_3', 'retailer_2', 'retailer_2', 'retailer_3', 'retailer_7', 'retailer_1', 'retailer_2', 'retailer_1', 'retailer_2']
}
)我们的目标是为 sample2 添加一个名为 is_new_retailer 的列,如果某个 (user_id, retailer) 对在 sample2 中出现,但在 sample1 中未出现,则该列值为1,否则为0。
pd.merge 函数提供了一个 indicator 参数,当设置为 True 或指定一个列名时,它会在合并结果中添加一个特殊列,指示每行数据是来自左表、右表还是两者兼有。这对于识别“左表独有”的记录非常有用。
# 使用merge与indicator参数
merged_df = sample2.merge(sample1, on=['user_id', 'retailer'], how='left', indicator='is_new_retailer_status')
merged_df['is_new_retailer'] = merged_df['is_new_retailer_status'].eq('left_only').astype(int)
# 移除辅助列,如果不需要
result_merge = merged_df.drop(columns=['is_new_retailer_status'])
print("--- 解决方案一:使用 merge 和 indicator ---")
print(result_merge)这种方法直观且高效。'left_only' 状态精确地标识了在 sample2 中存在但在 sample1 中不存在的 (user_id, retailer) 对,这正是我们定义“新零售商”的标准。需要注意的是,这种方法在合并键(这里是 user_id 和 retailer)在两个DataFrame中都没有重复值时表现完美。如果存在重复,merge 可能会产生笛卡尔积,但对于我们的场景,只要 (user_id, retailer) 对的唯一性是我们的关注点,它依然适用。
当需要对多列组合进行集合操作(例如判断某个多列组合是否存在于另一个多列组合的集合中)时,使用 MultiIndex 是一种非常强大且通用的方法。
# 使用MultiIndex进行集合比较
# 为sample2和sample1创建MultiIndex
mux_sample2 = pd.MultiIndex.from_frame(sample2[['user_id', 'retailer']])
mux_sample1 = pd.MultiIndex.from_frame(sample1[['user_id', 'retailer']])
# 检查sample2中的(user_id, retailer)对是否不在sample1中
sample2['is_new_retailer'] = (~mux_sample2.isin(mux_sample1)).astype(int)
print("\n--- 解决方案二:使用 MultiIndex 进行集合比较 ---")
print(sample2)MultiIndex 方法提供了一个更具通用性的解决方案,它将 (user_id, retailer) 视为一个复合键,然后执行集合成员资格检查。Index.isin() 专门用于检查一个索引中的元素是否存在于另一个索引中。这种方法在概念上更接近于集合的“差集”操作,即找出 sample2 中有而 sample1 中没有的元素。它对原始DataFrame中的重复行处理得很好,因为 MultiIndex 本身就代表了唯一的组合。
通过上述两种方法,我们可以高效地在Pandas中识别并标记出用户在新时期内访问的新零售商,为进一步的用户行为分析(如新用户增长、零售商推荐系统等)奠定基础。
以上就是Pandas数据分析:识别用户新访问零售商的条件列创建方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号