使用具有相同列数的另一个 DF 过滤 DF 行

Filter DF rows using another DF with same amount of columns

我有两个 DataFrame,我将使用第二个过滤第一个。我的问题是,我该如何正确地写这个?过滤掉第一个 DataFrame 中与第二个 DataFrame 中的至少一行不匹配的任何行?

df1
SNP_1 SNP_2 SNP_3 SNP_3
A A A A
A C C G
A C T C
A C C G
df2
SNP_1 SNP_2 SNP_3 SNP_3
A A A A
C C C C
T T T T
A G T G

实际上这些DataFrame是不同的形状

https://imgur.com/a/MIVMie9

我试过了,但出现错误。该错误显示“ValueError:无法强制转换为 DataFrame,形状必须为 (11, 11):给定 (9020, 11)”

df1.eq(df2.to_numpy())

也试过了,报错。这里的错误是列表对象没有属性all()。但是我将如何从列表列表中传递一个列表,同时迭代每个列表值并与 df2 中的值进行比较?会更像这种方法还是上面那种方法?

df2.filter(regex='._', axis=1).to_numpy() == [i for i in df1].all().sum()

据我了解,您要在 df1 中查找行,其中每一列的值在 df2 中都有对应的匹配项?如果是这样,我想我已经弄清楚了,但是我的方法对于大型数据帧不是最佳的,因为我使用了 .itterrows().

#find unique rows from df2
df2_unique = df2.drop_duplicates()

#initalize a boolean list
result_bool_mask = []
for idx,row in df1.iterrows():

    # append this row onto the end of df2's unique values and see if it's duplicated
    # here i use the keys parameter to add a multiindex to the result so we can easily find our result
    result = pd.concat([df2_unique, row.to_frame().T],keys=['df2','df1']).duplicated().loc['df1']

    #append the result onto our list
    result_bool_mask.append(result.values[0])

# use the boolean mask to filter down df2 to just the rows that entirely match a row from df1:
df1.loc[result_bool_mask]

希望对您有所帮助!第一次回答问题,请多多关照:)

您可以通过将 df1 和索引列与 df2 和 flag 列合并来创建辅助数据框。 flag 列表明合并键是否匹配。

df_ = df1.assign(Index=df1.index).merge(df2.assign(flag=1), left_on=['SNP_1', 'SNP_2', 'SNP_3', 'SNP_4'], right_on=['SNP_1', 'SNP_2', 'SNP_3', 'SNP_4'], how='left')
print(df_)

  SNP_1 SNP_2 SNP_3 SNP_4  Index  flag
0     A     A     A     A      0   1.0
1     A     C     C     G      1   NaN
2     A     C     T     C      2   NaN
3     A     C     C     G      3   NaN

然后使用辅助数据框 Index 列判断原始数据框行是否匹配。

filter_mask = df1.index.isin(df_[df_['flag'].eq(1)]['Index'].drop_duplicates())
print(filter_mask)

[ True False False False]