提取df1独有行并保留专属列时遇KeyError问题求助
问题:提取df1中不存在于df2的行并解决KeyError
需求说明
- 目标:找出DataFrame
df1中存在但df2中缺失的行,结果df3保留df1的全部列 - 列信息:
- df1:
FIRSTOCCURRENCE_IPCORE、IDENTIFIER、Order_IPCORE - df2:
FIRSTOCCURRENCE_IPCORE、IDENTIFIER_x、Order_IPCORE
- df1:
原代码与报错
原代码尝试通过merge+indicator筛选,但抛出KeyError:
df3 = df1.loc[df1.merge( df2, left_on=[ 'FIRSTOCCURRENCE_IPCORE','IDENTIFIER', 'Order_IPCORE'], right_on=['FIRSTOCCURRENCE_IPCORE', 'IDENTIFIER_x', 'Order_IPCORE'], how='left', indicator=True ).query('_merge == "left_only"').index]
报错信息:
KeyError: [1699, 1700, 1703, 1709, 1710, 1711, 1714, 1715, 1716, 1720, 1721, 1722, 1723, 1726, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1747, 1748, 1749, 1750, 1752, 1753, 1755, 1757, 1758, 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1783, 1784, 1785, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799] not in index
错误原因
merge操作后生成的新DataFrame会重新生成索引,这个索引和原始df1的索引不匹配。用merge结果的索引去取df1的行,自然会出现索引不存在的KeyError。
解决方案
方法1:直接从merge结果中筛选并保留df1列
不需要依赖索引匹配,直接从merge后的结果中筛选left_only的行,再提取df1的全部列:
# 执行左连接并添加_merge标识列 merged_df = df1.merge( df2, left_on=['FIRSTOCCURRENCE_IPCORE', 'IDENTIFIER', 'Order_IPCORE'], right_on=['FIRSTOCCURRENCE_IPCORE', 'IDENTIFIER_x', 'Order_IPCORE'], how='left', indicator=True ) # 筛选仅在df1中存在的行,保留df1的列 df3 = merged_df[merged_df['_merge'] == 'left_only'][df1.columns]
方法2:利用索引集合匹配(更高效)
将两表的匹配列转为索引集合,通过isin判断行是否存在,适合大数据集:
# 将df2的匹配列转为MultiIndex集合 df2_index = df2.set_index( ['FIRSTOCCURRENCE_IPCORE', 'IDENTIFIER_x', 'Order_IPCORE'] ).index # 将df1的匹配列转为MultiIndex,筛选不在df2_index中的行 df3 = df1[ ~df1.set_index( ['FIRSTOCCURRENCE_IPCORE', 'IDENTIFIER', 'Order_IPCORE'] ).index.isin(df2_index) ]
内容的提问来源于stack exchange,提问作者asmaa mahmoud
相关产品推荐
相关产品推荐

