寻找一种有效的方法来搜索大型DataFrame并返回包含字符串的单元格的行号。我有下面的代码有效,但是只是想知道这是否是最有效的方法,因为它涉及两个“ for”循环
在此示例中,我试图查找包含“汽车类型”的单元格
for row in range(df.shape[0]): # Loop through rows
for col in range(df.shape[1]): # Loop through columns
if df.iat[row, col] == 'Car Type':
row_start: int = row
break
在DataFrames上for循环实际上可能非常快,但是据我所读,最好使用Pandas的内置功能以提高效率,而且我不确定我是否在做这比需要的要复杂
编辑:理想情况下,仅在可能的情况下使用Pandas库解决方案
答案 0 :(得分:2)
如果您具有列列表,则可以进行
df.query('col_name'=='汽车类型')
如果这是您所需要的,则可以使用此方法来实现。如果您需要更多说明,请随时添加评论。
答案 1 :(得分:0)
编辑:
Pandas解决方案-首先通过DataFrame.stack
重塑形状,然后删除第二级MultiIndex
和最后一个过滤器index
值:
df = pd.DataFrame({
'A':list('abcdef'),
'B':[4,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'D':[1,3,5,7,'Car Type',0],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')
})
print (df)
A B C D E F
0 a 4 7 1 5 a
1 b 5 8 3 3 a
2 c 4 9 5 6 a
3 d 5 4 7 9 b
4 e 5 2 Car Type 2 b
5 f 4 3 0 4 b
r = df.stack().reset_index(level=1, drop=True) == 'Car Type'
out = next(iter(r.index[r]), 'no match')
print (out)
4
如果性能很重要,Numpy解决方案会更好:
通过将2d numpy数组与numpy.where
进行比较,然后将next
与iter
进行比较,可以得到第一个匹配索引值的位置,如果不匹配,则返回默认值:>
r, c = np.where(df.values == 'Car Type')
out = next(iter(r), 'no match')
如果不是默认索引值:
out = next(iter(df.index[r]), 'no match')