给定一个具有列"BoolCol“的DataFrame,我们希望找到其中"BoolCol”的值为真的DataFrame的索引
我目前有一种迭代的方式来做这件事,它工作得很好:
for i in range(100,3000):
if df.iloc[i]['BoolCol']== True:
print i,df.iloc[i]['BoolCol']
但这不是熊猫的正确做法。经过一些研究,我目前正在使用以下代码:
df[df['BoolCol'] == True].index.tolist()
这给了我一个索引列表,但它们不匹配,当我通过执行以下操作检查它们时:
df.iloc[i]['BoolCol']
结果实际上是假的!!
哪种方式才是熊猫的正确方式呢?
发布于 2016-12-31 05:53:50
可以使用numpy where()函数来完成:
import pandas as pd
import numpy as np
In [716]: df = pd.DataFrame({"gene_name": ['SLC45A1', 'NECAP2', 'CLIC4', 'ADC', 'AGBL4'] , "BoolCol": [False, True, False, True, True] },
index=list("abcde"))
In [717]: df
Out[717]:
BoolCol gene_name
a False SLC45A1
b True NECAP2
c False CLIC4
d True ADC
e True AGBL4
In [718]: np.where(df["BoolCol"] == True)
Out[718]: (array([1, 3, 4]),)
In [719]: select_indices = list(np.where(df["BoolCol"] == True)[0])
In [720]: df.iloc[select_indices]
Out[720]:
BoolCol gene_name
b True NECAP2
d True ADC
e True AGBL4
虽然你并不总是需要索引来匹配,但是如果你需要:
In [796]: df.iloc[select_indices].index
Out[796]: Index([u'b', u'd', u'e'], dtype='object')
In [797]: df.iloc[select_indices].index.tolist()
Out[797]: ['b', 'd', 'e']
发布于 2020-01-08 19:30:33
如果您只想使用dataframe对象一次,请使用:
df['BoolCol'].loc[lambda x: x==True].index
发布于 2019-06-21 12:56:33
简单的方法是在过滤前重置DataFrame的索引:
df_reset = df.reset_index()
df_reset[df_reset['BoolCol']].index.tolist()
有点老生常谈,但很快!
https://stackoverflow.com/questions/21800169
复制相似问题