基于两列的组合筛选 Pandas 数据帧



假设我有一个数据帧,

   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)的组合也包含在上述方法中。但我只需要给定的组合。我有一个庞大的两列元组列表,我想根据这些元组考虑相应的元组组合来过滤数据帧。

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

使用 -

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)])搜索所需的元组并给出布尔序列

@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)]

使用应用功能相比,这导致 1,000,000 X 2 尺寸的 df 的速度提高了 ~5 倍。

另一个想法是将两列(ab)连接为字符串,并检查1243,即

df[df.astype(str).sum(axis = 1).isin([12, 43])]
#   a  b
#0  1  2
#3  4  3

相关内容

最新更新