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
相关产品推荐
相关产品推荐

