Python Pandas:获取多行索引,其列与特定值匹配

5

给定一个包含列 xkykDataFrame,我们希望找到 xkyk == 0 值的索引。

当只有一个列时,它可以正常工作,但对于两个列我无法使其正常工作。

b = (df[df['xk'] ==0]).index.tolist()

如何同时对xkyk进行操作。

1个回答

6

我认为你可以通过使用all函数来检查在比较的子集['xk', 'yk']中是否所有值都为True

b = df[(df[['xk', 'yk']] == 0).all(1)].index.tolist()

另一个解决方案是添加第二个带有&的条件:
b = (df[(df['xk']  == 0) & (df['yk'] == 0)].index.tolist())

示例:

df = pd.DataFrame({'xk':[0,2,3],
                   'yk':[0,5,0],
                   'aa':[0,1,0]})

print (df)
   aa  xk  yk
0   0   0   0
1   1   2   5
2   0   3   0

b = df[(df[['xk', 'yk']] == 0).all(1)].index.tolist()
print (b)
[0]

b1 = (df[(df['xk']  == 0) & (df['yk'] == 0)].index.tolist())
print (b1)
[0]

第二种解决方案更快:

#length of df = 3k
df = pd.concat([df]*1000).reset_index(drop=True)

In [294]: %timeit df[(df[['xk', 'yk']] == 0).all(1)].index.tolist()
1000 loops, best of 3: 1.21 ms per loop

In [295]: %timeit (df[(df['xk']  == 0) & (df['yk'] == 0)].index.tolist())
1000 loops, best of 3: 828 µs per loop

谢谢,那个完美地解决了我的问题。如果我只想返回特定行的索引而不是所有索引列表,该怎么办? - WGP
我不确定是否理解。如果使用 `df = pd.DataFrame({'xk':[0,2,0], 'yk':[0,5,0], 'aa':[0,1,0]})print (df)然后你得到 DataFrame - a = (df.ix[(df['xk'] == 0) & (df['yk'] == 0)])`。你需要返回例如第一个索引或第二个索引位置的值吗? - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接