解决Pandas合并两个DataFrame时出现重复行的问题
解决方法
同一个用户同一天有多条进出记录时,直接按User和Date合并必然会产生笛卡尔积。核心思路是给每组记录按时间排序后加组内序号,再通过序号关联匹配,就能得到一一对应的进出时间对。
步骤1:给进入记录加组内序号
先把时间列转成时间类型(保证排序准确),再按用户、日期分组,对进入时间升序排序后,给每条记录标记当天的进入次数:
import pandas as pd # 转换时间列格式 dfenter['Enter_Time'] = pd.to_datetime(dfenter['Enter_Time'], format='%H:%M:%S').dt.time dfexit['Exit_Time'] = pd.to_datetime(dfexit['Exit_Time'], format='%H:%M:%S').dt.time # 排序并添加组内序号 dfenter = dfenter.sort_values(['User', 'Date', 'Enter_Time']) dfenter['visit_id'] = dfenter.groupby(['User', 'Date']).cumcount() + 1
步骤2:给退出记录加组内序号
用同样的逻辑处理退出记录,按退出时间升序排序后添加组内序号:
dfexit = dfexit.sort_values(['User', 'Date', 'Exit_Time']) dfexit['visit_id'] = dfexit.groupby(['User', 'Date']).cumcount() + 1
步骤3:按三个字段合并
现在用User、Date和visit_id三个字段合并,就能得到准确的进出时间对:
merged_df = dfenter.merge(dfexit, on=['User', 'Date', 'visit_id'], how='outer')
最终结果示例
处理后的merged_df结构如下:
| User | Date | Enter_Time | visit_id | Exit_Time |
|---|---|---|---|---|
| A | 2023-10-09 | 08:09:37 | 1 | 12:43:28 |
| A | 2023-10-09 | 17:07:55 | 2 | 22:32:57 |
这个方法适配大数据集,groupby和cumcount都是Pandas的高效内置操作,不会产生冗余数据,能精准匹配每一次进出记录。
内容的提问来源于stack exchange,提问作者Berkay
相关产品推荐
相关产品推荐

