繁体   English   中英

返回第一个包含Pandas DataFrame中字符串的单元格-最有效的方法吗?

[英]Return first cell containing string in Pandas DataFrame - most efficient way?

寻找一种有效的方法来搜索大型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

也许for循环实际上在DataFrames上是相当快的,但是据我所读,最好使用Pandas的内置功能以提高效率,而且我不确定是否要使它变得更复杂比它需要的

编辑:理想情况下,仅在可能的情况下使用Pandas库解决方案

如果您具有列列表,则可以

df.query('col_name'=='汽车类型')

如果这是您所需要的,则可以使用此方法来实现。 如果您需要更多说明,请随时添加评论。

编辑:

熊猫解决方案-首先通过DataFrame.stack重塑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进行比较来获取第一个匹配索引值的位置,然后使用iter进行next以获取不匹配值的可能返回默认值:

r, c = np.where(df.values == 'Car Type')
out = next(iter(r), 'no match')

如果不是默认索引值:

out = next(iter(df.index[r]), 'no match')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM