Pandas筛选最近一周无访客地点时遇轴重索引错误求助
解决方法
首先,你的代码逻辑和报错问题可以从以下几点修正:
1. 修正筛选逻辑
你的需求是找2023/3/17这周没有访客的地点,但当前代码筛选的是visits != 0(有访客的记录),完全和需求相反,需要调整为匹配无访客的条件。
2. 解决重复轴报错
ValueError: cannot reindex from a duplicate axis通常是因为原始数据集的索引存在重复值,或是groupby操作触发了重复索引冲突,可按以下步骤处理:
步骤一:先提取目标周数据
先筛选出2023/3/17这一周的所有记录,建议先统一日期格式避免匹配问题:
import pandas as pd # 转换日期列格式为datetime df['end_date'] = pd.to_datetime(df['end_date'], format="%m/%d/%Y") # 提取目标周数据 df_target_week = df[df['end_date'] == pd.to_datetime("2023-03-17")].copy()
步骤二:按数据情况筛选无访客地点
情况1:地点在该周有记录但访客量为0
直接筛选访客量为0的记录,再去重得到唯一地点:
# 筛选该周访客量为0的记录 df_no_visits = df_target_week[df_target_week['visits'] == 0] # 去重,保留唯一地点 df_no_visits_unique = df_no_visits.drop_duplicates(subset=['id', 'name', 'lat', 'lng'])
情况2:地点在该周无任何记录(视为无访客)
如果部分地点在目标周没有数据,需要对比全量地点列表:
# 获取所有唯一地点 all_locations = df.drop_duplicates(subset=['id', 'name', 'lat', 'lng']) # 获取目标周有数据的地点 visited_locations = df_target_week.drop_duplicates(subset=['id', 'name', 'lat', 'lng']) # 找出目标周无记录的地点 df_no_visits = all_locations[~all_locations['id'].isin(visited_locations['id'])]
步骤三:修正groupby用法(若需分组统计)
如果一定要用groupby,先重置索引避免重复轴问题,同时用sum()统计访客总量(而非count()统计记录数):
# 重置索引,消除重复索引 df = df.reset_index(drop=True) df_target_week = df[df['end_date'] == pd.to_datetime("2023-03-17")] # 按地点分组,统计该周访客总量 df_group = df_target_week.groupby(['id','name','lat', 'lng'])['visits'].sum().reset_index() # 筛选总量为0的地点 df_no_visits = df_group[df_group['visits'] == 0]
内容的提问来源于stack exchange,提问作者Ryan Jones
相关产品推荐
相关产品推荐

