如何根据In/Out列的值对Pandas DataFrame进行条件去重?
解决方案
要实现根据In/Out的值差异化保留重复行的需求,可以通过拆分数据子集分别处理后合并的方式实现,具体步骤如下:
步骤说明
- 将数据按
In/Out拆分为两个子集:df_in(值为'in')和df_out(值为'out') - 对
df_in:按['Id', 'Day', 'In/Out']分组,保留每组的首行(对应最早的记录) - 对
df_out:按['Id', 'Day', 'In/Out']分组,保留每组的末行(对应最晚的记录) - 合并两个处理后的子集,可按需恢复原数据顺序
代码实现
import pandas as pd # 示例数据初始化 data = { 'Id': [1,3,4,4,1,3,4,4,1,3,3,4,1,3,4], 'Day': [2,2,2,2,2,2,2,2,3,3,3,3,3,3,3], 'Hour': [5,5,6,7,14,14,14,15,5,5,6,7,14,14,15], 'In/Out': ['in','in','in','in','out','out','out','out','in','in','in','in','out','out','out'] } df = pd.DataFrame(data) # 拆分in和out子集 df_in = df[df['In/Out'] == 'in'] df_out = df[df['In/Out'] == 'out'] # 处理in组:保留每组首行 df_in_processed = df_in.drop_duplicates(subset=['Id', 'Day', 'In/Out'], keep='first') # 处理out组:保留每组末行 df_out_processed = df_out.drop_duplicates(subset=['Id', 'Day', 'In/Out'], keep='last') # 合并结果并按原索引排序 final_df = pd.concat([df_in_processed, df_out_processed]).sort_index() print(final_df)
输出结果
Id Day Hour In/Out 0 1 2 5 in 1 3 2 5 in 2 4 2 6 in 4 1 2 14 out 5 3 2 14 out 7 4 2 15 out 8 1 3 5 in 9 3 3 5 in 10 3 3 6 in 11 4 3 7 in 12 1 3 14 out 13 3 3 14 out 14 4 3 15 out
该结果完全匹配示例中标记的保留/移除规则:in类型的重复组保留首行,out类型的重复组保留末行。
内容的提问来源于stack exchange,提问作者benek
相关产品推荐
相关产品推荐

