Вернуть первую ячейку, содержащую строку в DataFrame Pandas - самый эффективный способ? - PullRequest
0 голосов
/ 09 апреля 2019

В поисках эффективного способа поиска большого 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, только если это возможно

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Если у вас есть список столбцов, вы можете сделать

df.query ('col_name' == 'Тип автомобиля')

Если это то, что вам нужно, вы можете достичь этого, используя это. Если вам нужны дополнительные разъяснения, не стесняйтесь добавлять комментарии.

0 голосов
/ 09 апреля 2019

РЕДАКТИРОВАТЬ:

Решение 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...