假设我有一个简单的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')]
。
非常感谢帮助。谢谢!
答案 0 :(得分:2)
使用boolean indexing
和Series.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'))]