You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中根据另一DataFrame公共数据删除行且保留原索引的方法

问题原因

你之前用drop_duplicates(keep=False)出错的核心原因是:该参数会删除所有出现次数≥2的行,而data_1本身存在内部重复行(比如2021-07-21对应的两个81.322),拼接后这两行的出现次数为2,就会被误判为需要删除的重复项。

正确实现方案

你可以通过以下两种方法实现需求,两种方法都会保留data_1的原有索引:

方法1:元组匹配法(适合小数据量)

将每行的Date和UID转为元组,直接判断data_1的行是否不在data_2的行集合中即可:

import pandas as pd
import numpy as np

# 你的原始构造代码
Date = [np.datetime64('2021-07-21'), np.datetime64('2021-07-21'), np.datetime64('2021-07-21'), np.datetime64('2021-07-21'),
       np.datetime64('2021-07-22'), np.datetime64('2021-07-22'), np.datetime64('2021-07-22'), np.datetime64('2021-07-22'),
       np.datetime64('2021-07-23'),np.datetime64('2021-07-23')]
UID = [81.322, 81.322, 81.452, 81.552, 82.522, 82.562, 82.722, 81.723, 81.322, 81.332 ]
data_1 = pd.DataFrame({'Date': Date, 'UID': UID})

Date_2 = [np.datetime64('2021-07-21'), np.datetime64('2021-07-21'), np.datetime64('2021-07-22'), np.datetime64('2021-07-23')]
UID_2 = [81.452,81.552, 82.562, 81.322 ]
data_2 = pd.DataFrame({'Date': Date_2, 'UID': UID_2})

# 核心筛选逻辑
mask = ~data_1[['Date', 'UID']].apply(tuple, axis=1).isin(data_2[['Date', 'UID']].apply(tuple, axis=1))
result = data_1[mask]
print(result)

方法2:merge指示符法(适合大数据量,性能更高)

用左连接的指示符标记行来源,只保留仅在data_1中存在的行:

# 临时存储原索引
data_1['origin_index'] = data_1.index
# 左连接并标记来源
merged_df = pd.merge(data_1, data_2, on=['Date', 'UID'], how='left', indicator=True)
# 筛选仅在data_1中存在的行,恢复原索引
result = merged_df[merged_df['_merge'] == 'left_only'].set_index('origin_index').drop(['_merge'], axis=1)
# 清除索引名
result.index.name = None
print(result)

输出结果

两种方法都会得到你需要的结果:

Date     UID
0 2021-07-21  81.322
1 2021-07-21  81.322
4 2021-07-22  82.522
6 2021-07-22  82.722
7 2021-07-22  81.723
9 2021-07-23  81.332

内容的提问来源于stack exchange,提问作者user3234242

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:06:03