基于首个DataFrame的顺序与名称缩减第二个DataFrame的形状
解决方案:匹配df1的行顺序与名称,过滤df2
这有几个简单高效的方法,帮你快速得到和df1行顺序、名称完全匹配的df2子集:
方法1:使用merge(贴合你提到的合并思路)
既然你了解过Pandas的合并操作,咱们可以直接用左连接来保留df1的原始顺序,同时只提取df2中匹配的行:
# 仅保留df1的names列,和df2做左连接,sort=False确保顺序不变 filtered_df2 = df1[['names']].merge(df2, on='names', how='left', sort=False)
这个操作的逻辑是:以df1的names列为基准,把df2中对应的行匹配过来,最终结果的行数和顺序完全和df1一致,完美满足你的需求。
方法2:利用reindex严格对齐顺序
如果想更直接地按df1的顺序重新排列df2,可以先把df2的names设为索引,再用df1的names序列重新索引:
# 将df2的names列设为索引,按df1的names顺序提取行,最后重置索引恢复原结构 filtered_df2 = df2.set_index('names').reindex(df1['names']).reset_index()
这个方法的优势是严格保证行顺序和df1完全一致,哪怕df2里的行原本和df1顺序不同,也能直接对齐。
方法3:极简写法(一步到位)
还有个更简洁的版本,用loc直接按df1的names序列提取:
filtered_df2 = df2.set_index('names').loc[df1['names']].reset_index()
原理和方法2一样,loc接收一个序列时,会按照序列的顺序返回对应的行,因为你已经确认df1的所有names都在df2中,所以不会出现缺失值。
验证结果
执行完上述任意一种方法后,可以检查结果的形状是否符合预期:
print(filtered_df2.shape) # 应该输出 (8190, 3)
补充说明
你之前尝试的代码是找出df2中多余的名称,但这种“删除多余行”的思路很难保证最终的行顺序和df1一致——因为df2中剩余的行可能还是乱序的。而上面的方法都是直接以df1为基准提取并对齐,能从根源上保证顺序正确。
内容的提问来源于stack exchange,提问作者hemanta
相关产品推荐
相关产品推荐

