Проверьте, находится ли строка в списке между двумя другими строками в списке?

#python #pandas #list

#питон #панды #Список

Вопрос:

 import pandas as pd   nameBank = ["John Doe", "Jane Doe", "Patrick Star", "Spongebob Squarepants"] phoneList = [] nameList = []  list1 = ["1234567890", "John doe", "Not a NAME/USELESS FILLERINFO", "2345678901", "jane doe", "Not a NAME/USELESS FILLERINFO", "Not a NAME/USELESS FILLERINFO", "3456789012", "4567890123", "5678901234", "patrick star", "6789012345"]  df = pd.DataFrame({'Phone Number': phoneList, 'Name': nameList}) df.to_csv('results.csv', index=False, encoding='utf-8') print(df)  

Что я хочу сделать, так это извлечь из этого списка1 каждый номер телефона и поместить его в phoneList .

Оттуда я хочу посмотреть, есть ли имя из nameBank списка, которое находится в списке после текущего номера телефона и перед следующим номером телефона в списке.

Если после номера телефона есть имя, то я хочу иметь возможность добавить его к nameList , если после номера телефона нет имени, то я хочу добавить «Имя не найдено» к nameList . Таким образом, он может по существу соответствовать диаграмме Excel.

то есть номер телефона 1234567890 имеет имя Джон Доу, соответствующее ему между двумя списками. Ко второму номеру телефона прикреплено имя Джейн Доу, поэтому, когда вы используете эти два списка для создания таблицы с использованием панд, они будут соответствовать. Третий номер телефона 3456789012 не имеет имени между собой и следующим номером телефона в списке, поэтому я хочу, чтобы добавленное значение в список имен было "no name found" .

По сути, как будет выглядеть выходная таблица: пример диаграммы

Комментарии:

1. Ваш пример кода выдает пустое df значение .

Ответ №1:

Итак, вы хотите разобрать list1 на ряд:

 list1 = ["1234567890", "John doe", "Not a NAME/USELESS FILLERINFO", "2345678901", "jane doe", "Not a NAME/USELESS FILLERINFO", "Not a NAME/USELESS FILLERINFO", "3456789012", "4567890123", "5678901234", "patrick star", "6789012345"]   import re  num = re.compile('d{10}') output = {} i = 0 while i lt; len(list1):  if not num.match(list1[i]):  i  = 1  continue  output[list1[i]] = list1[i 1] if i 1lt;len(list1) and not num.match(list1[i 1]) else 'not found'  i  = 1   series = pd.Series(output)  

Выход:

 1234567890 John doe 2345678901 jane doe 3456789012 not found 4567890123 not found 5678901234 patrick star 6789012345 not found dtype: object  

Ответ №2:

 import pandas as pd  nameBank = ["John Doe", "Jane Doe", "Patrick Star", "Spongebob Squarepants"] list1 = ["1234567890", "John doe", "Not a NAME/USELESS FILLERINFO", "2345678901", "jane doe", "Not a NAME/USELESS FILLERINFO", "Not a NAME/USELESS FILLERINFO", "3456789012", "4567890123", "5678901234", "patrick star", "6789012345"]  data = [] for index, elem in enumerate(list1):  if elem.isnumeric():  if (len(list1) - 1) gt; index:  if list1[index 1].casefold() in map(str.casefold, nameBank):  data.append([elem,list1[index 1].title()])  else:  data.append([elem, 'No Name Found'])  else:  data.append([elem, 'No Name Found'])   df = pd.DataFrame(data, columns=['Phone Number', 'Name'])  # df.to_csv('results.csv', index=False, encoding='utf-8'  print(df)  

выход:

 Phone Number Name 0 1234567890 John Doe 1 2345678901 Jane Doe 2 3456789012 No Name Found 3 4567890123 No Name Found 4 5678901234 Patrick Star 5 6789012345 No Name Found  

Комментарии:

1. Спасибо всем вам за ответы. Они были чрезвычайно полезны! Как вы думаете, что бы вы сделали, если бы имя не всегда стояло сразу после номера телефона? Скажем, например: list1 = [«1234567890», «Не ИМЯ/БЕСПОЛЕЗНЫЙ FILLERINFO», «Неизвестный Джон» «2345678901», «Неизвестная Джейн», «Не ИМЯ/БЕСПОЛЕЗНЫЙ FILLERINFO», «Не ИМЯ/БЕСПОЛЕЗНЫЙ FILLERINFO», «3456789012», «4567890123», «5678901234», «Не ИМЯ/БЕСПОЛЕЗНЫЙ FILLERINFO», «Не ИМЯ/БЕСПОЛЕЗНЫЙ FILLERINFO», «Не ИМЯ/БЕСПОЛЕЗНЫЙ FILLERINFO», «Патрик стар», «6789012345»]

Ответ №3:

 import re import pandas as pd  list1 = ["1234567890", "John doe", "Not a NAME/USELESS FILLERINFO", "2345678901", "jane doe", "Not a NAME/USELESS FILLERINFO", "Not a NAME/USELESS FILLERINFO", "3456789012", "4567890123", "5678901234", "patrick star", "6789012345"] nameBank = ["John Doe", "Jane Doe", "Patrick Star", "Spongebob Squarepants"]  def mapList(list1):  output = []  for index, item in enumerate(list1, start=0):   if re.match("^d{10}", item):  # Use any one condition   # if index lt; len(list1) - 1 and list1[index   1] in nameBank:  if index lt; len(list1) - 1 and not re.match("^d{10}", list1[index   1]):  output.append([list1[index], list1[index 1]]);  else:  output.append([list1[index],'No Name Found']);  return output;   df = pd.DataFrame(mapList(list1), columns=['Phone Number', 'Name'])  print(df)  

Выход:

 Phone Number Name 0 1234567890 John doe 1 2345678901 jane doe 2 3456789012 No Name Found 3 4567890123 No Name Found 4 5678901234 patrick star 5 6789012345 No Name Found