
在用户行为分析中,我们经常需要识别用户在不同时间段内行为模式的变化。一个常见的场景是,给定用户在前期(pre-period)和后期(post-period)使用的零售商数据,我们需要找出在后期新增的零售商,即那些在后期使用但前期从未使用的零售商。这需要在每个用户(user_id)的“窗口”内进行比较。
为了演示这一过程,我们准备了两份模拟数据:sample1代表用户在前期使用的零售商,sample2代表用户在后期使用的零售商。
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']
}
)
print("Sample 1 (前期数据):")
print(sample1)
print("\nSample 2 (后期数据):")
print(sample2)我们的目标是在sample2中添加一个名为is_new_retailer的条件列,如果某个user_id与retailer的组合在sample2中存在,但在sample1中不存在,则该列值为1,否则为0。
Pandas的merge函数提供了一个indicator参数,可以在合并结果中添加一个特殊列,指示每行数据是来源于左表、右表还是两者的交集。这对于识别数据集间的差异非常有用。
# 方法一:使用 merge 的 indicator 参数
merged_df = sample2.merge(sample1, on=['user_id', 'retailer'], how='left', indicator='_merge_indicator')
# 'left_only' 表示该行(user_id, retailer)组合只存在于 sample2 中
merged_df['is_new_retailer'] = (merged_df['_merge_indicator'] == 'left_only').astype(int)
# 移除辅助的 _merge_indicator 列,只保留需要的列
result_merge = merged_df[['user_id', 'retailer', 'is_new_retailer']]
print("\n方法一结果 (使用 merge indicator):")
print(result_merge)MultiIndex允许我们将多个列组合成一个复合索引,然后可以利用索引的isin方法高效地检查一个复合键是否存在于另一个复合键集合中。这是一种更通用的集合成员判断方法。
# 方法二:使用 MultiIndex.isin
# 创建 sample2 的 MultiIndex
mux2 = pd.MultiIndex.from_frame(sample2[['user_id', 'retailer']])
# 创建 sample1 的 MultiIndex
mux1 = pd.MultiIndex.from_frame(sample1[['user_id', 'retailer']])
# 判断 sample2 中的组合是否在 sample1 中出现过
# ~ 表示取反,即不在 sample1 中的组合
sample2['is_new_retailer'] = (~mux2.isin(mux1)).astype(int)
result_multiindex = sample2
print("\n方法二结果 (使用 MultiIndex.isin):")
print(result_multiindex)两种方法都能有效解决在用户维度上识别新增零售商的问题,并且在本例中产生了相同的结果。
在实际应用中,如果你的主要目标是识别特定组合的成员关系,并且数据量较大,MultiIndex.isin通常是一个高效且优雅的选择。如果你的任务还涉及到从两个表中获取更多相关信息,那么pd.merge会是更合适的工具。
通过本文,我们学习了两种在Pandas中高效识别用户新增零售商的方法。无论是利用pd.merge的indicator参数进行合并识别,还是通过构建MultiIndex并运用Index.isin进行集合成员判断,都能帮助数据分析师准确地标记出用户在后期新增的零售商。选择哪种方法取决于具体的应用场景、数据规模以及个人偏好。掌握这些技术将有助于你在数据分析工作中更灵活地处理复杂的条件列创建任务。
以上就是利用Pandas在窗口内创建条件列以识别新增零售商的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号