使用具有相同列数的另一个 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是不同的形状
我试过了,但出现错误。该错误显示“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]
我有两个 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是不同的形状
我试过了,但出现错误。该错误显示“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]