如何移除两个Pandas DataFrame中非共同索引的行?
移除Pandas DataFrame中非共同索引的行
问题背景
已通过以下代码创建两个Pandas DataFrame:
import pandas.util.testing as testing df = testing.makeDataFrame()
其中df1比原始df少两行,数据如下:
原始df数据:
A B C D OdhGFPa5Kw -0.686378 -1.210838 1.160708 0.903309 gelZFj4BG5 1.603112 1.852592 -0.065482 0.684566 mp3Aq5ueGD 0.254211 -0.788877 -0.626789 0.109116 pBtz9DHxUZ -0.970632 0.982661 -0.463984 -0.123727 K28pzbdYcX -1.311220 -2.121306 1.209484 -1.695901 71ZFgWaeDE 1.887420 0.337702 -0.176539 0.149089 alWOjkQ2eZ 1.997701 -0.354276 1.997802 -0.086803
df1数据:
A B C D OdhGFPa5Kw -0.686378 -1.210838 1.160708 0.903309 gelZFj4BG5 1.603112 1.852592 -0.065482 0.684566 mp3Aq5ueGD 0.254211 -0.788877 -0.626789 0.109116 pBtz9DHxUZ -0.970632 0.982661 -0.463984 -0.123727 K28pzbdYcX -1.311220 -2.121306 1.209484 -1.695901
已通过以下代码获取共同索引集合:
duplicates = set(df.index).intersection(df1.index)
需要移除两个DataFrame中索引不在duplicates里的行。
解决方案
方法1:使用loc+isin筛选(推荐,生成新DataFrame)
直接通过索引是否在共同集合中来筛选行,返回新的DataFrame:
# 筛选df中符合条件的行 df_filtered = df.loc[df.index.isin(duplicates)] # 筛选df1中符合条件的行 df1_filtered = df1.loc[df1.index.isin(duplicates)]
方法2:使用drop原地删除行
如果需要直接修改原DataFrame,可以先找出需要删除的索引,再执行删除:
# 找出df中不在共同索引里的行 to_drop_df = df.index.difference(duplicates) # 原地删除这些行 df.drop(to_drop_df, inplace=True) # 同理处理df1 to_drop_df1 = df1.index.difference(duplicates) df1.drop(to_drop_df1, inplace=True)
方法3:无需手动求交集,直接用Pandas内置方法
可以跳过手动计算交集的步骤,直接利用索引匹配来筛选:
# 直接保留df中存在于df1索引中的行 df_filtered = df[df.index.isin(df1.index)] # 同理处理df1 df1_filtered = df1[df1.index.isin(df.index)]
或者用join做内连接,自动保留共同索引的行:
# 内连接两个DataFrame,仅保留共同索引的行(会保留双方列,可按需选择) df_filtered = df.join(df1, how='inner', lsuffix='_original', rsuffix='_df1')
内容的提问来源于stack exchange,提问作者Slartibartfast
相关产品推荐
相关产品推荐

