在熊猫数据框的列和行中查找所有重复模式的所有索引/实例

时间:2019-10-02 05:16:21

标签: python pandas dataframe

假设我有一个简单的pandas数据框df

     | name      | car   |
|----|-----------|-------|
| 0  | 'bob'     | 'b'   |
| 1  | 'bob'     | 'c'   |
| 2  | 'fox'     | 'b'   |
| 3  | 'fox'     | 'c'   |
| 4  | 'cox'     | 'b'   |
| 5  | 'cox'     | 'c'   |
| 6  | 'jo'      | 'b'   |
| 7  | 'jo'      | 'c'   |
| 8  | 'bob'     | 'b'   |
| 9  | 'bob'     | 'c'   |
| 10 | 'bob'     | 'b'   |
| 11 | 'bob'     | 'c'   |
| 12 | 'rob'     | 'b'   |
| 13 | 'rob'     | 'c'   |

我想找到跨越两列的特定模式的行索引。在我的实际应用程序中,上面的数据帧有几千行,而我有几千个数据帧,因此性能并不重要。我感兴趣的模式是:

| 'bob'     | 'b'   |
| 'bob'     | 'c'   |

因此,使用上面的示例,我想要的输出将是:

out_idx = [0,1,8,9,10,11]

当然,通常情况下,对于一种模式,人们会做类似df.loc[(df.name == 'bob') & (df.car == 'b')]的事情,但是当我在多列中寻找特定的多变量模式时,我不确定该怎么做。即我正在寻找(我很高兴以下内容不正确):df.loc[(df.name == 'bob') & (df.car == 'b') & (df.car == 'c')]

非常感谢帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

使用boolean indexingSeries.isin代替第二和第三种条件:

df1 = df[(df.name == 'bob') & df.car.isin(['b','c'])]
print (df1)
   name car
0   bob   b
1   bob   c
8   bob   b
9   bob   c
10  bob   b
11  bob   c

如果需要索引值:

out_idx = df.index[(df.name == 'bob') & df.car.isin(['b','c'])]

或者:

out_idx = df[(df.name == 'bob') & df.car.isin(['b','c'])].index

您可以使用|(按位或)而不是第二个&并添加一个()来解决您的问题:

df1 = df[(df.name == 'bob') & ((df.car == 'b') | (df.car == 'c'))]