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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Pandas DataFrame中返回包含字符串的第一个单元格 - 最有效的方法?相关的知识,希望对你有一定的参考价值。

寻找一种有效的方法来搜索大型DataFrame并返回包含字符串的单元格的行号。我有下面的代码可以工作,但只是想知道这是否是最有效的方法,因为它涉及两个“for”循环

在这个例子中,我试图找到一个包含“Car Type”的单元格

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循环在DataFrame上实际上非常快,但从我所读到的内容来看,最好尽可能多地使用Pandas的内置功能来提高效率,而且我不确定我是否会让这更复杂比它需要的

编辑:理想情况下,只有在可能的情况下才使用Pandas库

答案

如果您有列的列表,那么您可以这样做

df.query('col_name'=='Car Type')

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

另一答案

编辑:

熊猫解决方案 - 首先由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获得第一个匹配的索引值的位置,然后使用nextiter作为可能的返回默认值(如果不匹配的值):

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

如果不是默认索引值:

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

以上是关于在Pandas DataFrame中返回包含字符串的第一个单元格 - 最有效的方法?的主要内容,如果未能解决你的问题,请参考以下文章

pandas返回dataframe中指定数据列包含缺失值的数据行(rows with missing values in specific column of dataframe)

按标签选择的 Pandas 有时会返回 Series,有时会返回 DataFrame

在 Pandas Dataframe 中查找多个字典键并返回多个匹配值

如果 Pandas DataFrame 不包含某些子字符串

从 pandas DataFrame 中删除名称包含特定字符串的列

如何检查一系列字符串是不是包含在 PANDAS DataFrame 列中并将该字符串分配为行中的新列?