假设我有一个数据框,
a b
0 1 2
1 2 3
2 4 2
3 4 3
我想过滤数据框,以便得到结果,
a b
0 1 2
3 4 3
即,我希望通过将两列过滤在一起来组合(1,2)
和(4,3)
。
如果我尝试这个,
df1 = df[df['a'].isin([1,4]) & df['b'].isin([2,3])]
由于(1,3)
和(4,2)
的组合也包含在上述方法中,因此我得到了整个数据框。但是我只需要给定的组合。我有两列元组的庞大列表,我想根据它们考虑相应的元组组合来过滤数据框。
此外,我不想将两列合并为一个字符串,然后进行过滤。
答案 0 :(得分:3)
使用-
df[df[['a', 'b']].apply(tuple, axis=1).isin([(1,2), (4,3)])]
输出
a b
0 1 2
3 4 3
说明
df[['a', 'b']].apply(tuple, axis=1)
给出了一系列元组-
0 (1, 2)
1 (2, 3)
2 (4, 2)
3 (4, 3)
.isin([(1,2), (4,3)])
搜索所需的元组并给出布尔序列
答案 1 :(得分:2)
另一个想法是将两列(a
和b
)作为字符串连接,并检查12
和43
,即
df[df.astype(str).sum(axis = 1).isin([12, 43])]
# a b
#0 1 2
#3 4 3
答案 2 :(得分:2)
@Vivek Kalyanarangan概述的元组比较方法是可行的方法,但是在大型数据帧的情况下,通过使用MultiIndex而不是使用apply函数创建元组,可以显着提高速度:
例如,在您的情况下:
keep_tuples = [(1,2), (4,3)]
tuples_in_df = pd.MultiIndex.from_frame(df[["a","b"]])
df[tuples_in_df.isin(keep_tuples)]
与使用apply函数相比,这可将1,000,000 X 2大小的df速度提高约5倍。