如何使用Pandas的groupby遍历数组?基于多用户多推广活动CSV数据
使用Pandas Groupby处理用户-广告活动时序数据
看起来你已经拿到了一份包含用户ID、时间戳和广告活动的时序数据集,接下来我会一步步教你用Pandas的groupby工具来遍历和处理这类数据,覆盖不同的分析需求:
第一步:先把数据读进Pandas
首先确保导入Pandas,读取CSV时记得把时间列解析成时间格式(方便后续的时序操作):
import pandas as pd # 替换成你的CSV文件路径 df = pd.read_csv('your_data.csv', parse_dates=['date'])
方式1:基础遍历——按用户分组处理
最直接的方式是按user_id分组,逐个遍历每个用户的数据集,适合需要针对单个用户做个性化处理的场景:
# 按user_id分组,得到分组对象 user_groups = df.groupby('user_id') # 遍历每个用户的分组 for user_id, user_data in user_groups: print(f"=== 正在处理用户ID: {user_id} ===") # 先把该用户的活动按时间排序 sorted_user_data = user_data.sort_values('date') # 打印该用户的活动时序(只展示关键列) print(sorted_user_data[['date', 'ad_campaign']]) # 可以添加自定义逻辑,比如统计该用户的活动类型分布 campaign_counts = sorted_user_data['ad_campaign'].value_counts() print("该用户的广告活动分布:") print(campaign_counts) print("\n")
遍历过程中,user_id是当前分组的键,user_data是该用户对应的所有行组成的子DataFrame,你可以在循环里对它做任何自定义操作。
方式2:多维度分组——按用户+广告活动组合遍历
如果需要分析每个用户对不同广告活动的交互细节,可以同时按user_id和ad_campaign双维度分组:
# 按用户ID和广告活动双维度分组 user_campaign_groups = df.groupby(['user_id', 'ad_campaign']) for (user_id, campaign_name), group_data in user_campaign_groups: print(f"用户ID: {user_id} | 广告活动: {campaign_name}") print(f"交互次数: {len(group_data)}") print(f"首次交互时间: {group_data['date'].min()}") print(f"末次交互时间: {group_data['date'].max()}") print("---")
这里的分组键是一个元组(user_id, campaign_name),对应的group_data是该用户与该广告活动的所有交互记录。
方式3:高效批量处理——用apply替代手动遍历
如果所有分组的处理逻辑都相同,用apply会比手动遍历更高效,代码也更简洁:
# 定义一个处理单个用户分组的函数 def process_user_interactions(group): # 1. 按时间排序 sorted_group = group.sort_values('date') # 2. 添加一列:记录用户的活动序列(每次活动变化时递增) sorted_group['sequence_id'] = (sorted_group['ad_campaign'] != sorted_group['ad_campaign'].shift()).cumsum() # 3. 返回处理后的分组 return sorted_group # 将函数应用到每个用户分组,as_index=False避免把user_id设为索引 processed_df = df.groupby('user_id', as_index=False).apply(process_user_interactions) # 查看处理后的结果 print(processed_df.head(10))
apply会自动把每个用户的子DataFrame传入函数,处理完成后合并成一个完整的DataFrame。
小技巧:快速查看单个分组
如果你想快速查看某个特定用户的分组数据,可以用get_group方法:
# 获取用户ID为151312395的所有数据 specific_user_data = user_groups.get_group(151312395) print(specific_user_data)
内容的提问来源于stack exchange,提问作者Laila Van Ments
相关产品推荐
相关产品推荐

