根据两列的组合过滤熊猫数据框

may*_*wal 4 python pandas

假设我有一个数据框,

   a  b
0  1  2
1  2  3
2  4  2
3  4  3
Run Code Online (Sandbox Code Playgroud)

我想过滤数据框,以便得到如下结果:

   a  b
0  1  2
3  4  3
Run Code Online (Sandbox Code Playgroud)

即,我想要组合(1,2)(4,3)通过将两列过滤在一起。

如果我尝试这个

df1 = df[df['a'].isin([1,4]) & df['b'].isin([2,3])]
Run Code Online (Sandbox Code Playgroud)

我得到了整个数据框,因为(1,3)和的组合(4,2)也包含在上述方法中。但是我只需要给定的组合。我有两列元组的庞大列表,我想根据它们考虑相应的元组组合来过滤数据框。

另外,我不想将两列合并为一个字符串,然后进行过滤。

Md *_*zvi 11

@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)]
Run Code Online (Sandbox Code Playgroud)

与使用 apply 函数相比,这使得 1,000,000 X 2 大小的 df 的速度提高了约 5 倍。


Viv*_*gan 5

使用 -

df[df[['a', 'b']].apply(tuple, axis=1).isin([(1,2), (4,3)])]
Run Code Online (Sandbox Code Playgroud)

输出量

    a   b
0   1   2
3   4   3
Run Code Online (Sandbox Code Playgroud)

说明

df[['a', 'b']].apply(tuple, axis=1) 给出一系列元组-

0    (1, 2)
1    (2, 3)
2    (4, 2)
3    (4, 3)
Run Code Online (Sandbox Code Playgroud)

.isin([(1,2), (4,3)]) 搜索所需的元组并给出布尔序列