Найти местоположение индекса первого вхождения определенной частичной строки в кадре данных панд - PullRequest
0 голосов
/ 03 июля 2018

Я работаю с AFRINIC whois данными. Я пытаюсь найти местоположение первого вхождения подстроки. В этом примере (pandas dataframe с одним столбцом «data» слева является индексом) я пытаюсь найти подстроку «inetnum». Таким образом, результат, который я ищу, это "2750383".

    data
20  mnt-lower: info
21  changed: info
22  changed: info
23  changed: info
24  changed: info
25  source: info
26  as-block: info
27  type: info
28  descr: info
29  remarks: info
... ...
2750381 changed: info
2750382 source: info
2750383 inetnum: info
2750384 netname: info
2750385 descr: info
2750386 country: info
2750387 admin-c: info
2750388 tech-c: info
2750389 status: info

Я пробовал:

afrinic.data.ne('inetnum').idxmax()

Но это дает мне "[]", потому что он ищет первую целую строку и дает 0 результатов.

Я также пробовал:

indices = [i for i, s in enumerate(afrinic.data) if 'inetnum' in s]

Но это дает мне каждый индексный номер слова "inetnum", когда все, что я ищу, это индексный номер первого экземпляра. Я мог бы взять этот список и просто использовать верхний номер, но должен быть лучший способ сделать это. Любая помощь с благодарностью.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Вы очень близки. Используйте next с выражением генератора:

first_index = next((i for i, s in enumerate(afrinic.data) if 'inetnum' in s), None)

Если действительный индекс не найден, то next вернет None в соответствии с резервным аргументом.

Использование next с ручной итерацией будет более эффективным, чем методы, основанные на Pandas / NumPy, для больших фреймов данных, где вы ожидаете совпадения в начале вашей серии. В противном случае вы можете использовать методы pd.Series.str согласно решению @ jezrael.

0 голосов
/ 03 июля 2018

Используйте str.contains для проверки в любом положении:

out = afrinic.data.str.contains('inetnum').idxmax()
print (out)
2750383

Или str.startswith для начала теста каждой строки:

out = afrinic.data.str.startswith('inetnum').idxmax()

EDIT:

Более общее решение для работы, если не найдено ни одного значения:

m = afrinic.data.str.contains('inetnum')
out = m.idxmax() if m.any() else 'no match'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...