Сопоставление строк и хранение в словаре

#python #pandas #string #dataframe #dictionary

Вопрос:

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

 test = pd.DataFrame(['SR2', 'SA1', 'M16', 'KY6', 'SR6'], columns=(['postcode']))

street = pd.DataFrame(['UnnamedRoad,LlandeiloSA196UA,UK', '8NewRd,LlandeiloSA196DB,UK','1RomanRd,Banwen,NeathSA109LH,UK', 'UnnamedRoad,LlangadogSA199UN,UK', '48ColeAve,ChadwellStMary,GraysRM164JQ,UK', '37WellingtonRd,NorthWealdBassett,EppingCM166JY,UK'], columns=(['address']))

dictframe = {}
for i in test['postcode']:
    dictframe[i] = list()
    for k in range(0, len(test), 1):    
        dictframe[i].append(list(filter(lambda x: test['postcode'][k] in x, street['address'])))

 

Однако это выводит все выходные данные в каждом ключе, но я хотел только для тех случаев, когда значения, по-видимому, находятся внутри ключа, в противном случае держите список пустым, если ничего не совпадает. Вот результат, который я получаю:

 {'SR2': [[],
  ['UnnamedRoad,LlandeiloSA196UA,UK',
   '8NewRd,LlandeiloSA196DB,UK',
   '1RomanRd,Banwen,NeathSA109LH,UK',
   'UnnamedRoad,LlangadogSA199UN,UK'],
  ['48ColeAve,ChadwellStMary,GraysRM164JQ,UK',
   '37WellingtonRd,NorthWealdBassett,EppingCM166JY,UK'],
  [],
  []],
..
..
..
 

Ожидаемый результат:

 {'SR2': [],
'SA1': ['UnnamedRoad,LlandeiloSA196UA,UK',
   '8NewRd,LlandeiloSA196DB,UK',
   '1RomanRd,Banwen,NeathSA109LH,UK',
   'UnnamedRoad,LlangadogSA199UN,UK']
...
...
}
 

Ответ №1:

исправленный код — внутренний цикл for не требуется, и в строке, соответствующей индексу теста [«почтовый индекс»], необходимо использовать, см. Перечисление Python

 import pandas as pd
test = pd.DataFrame(['SR2', 'SA1', 'M16', 'KY6', 'SR6'], columns=(['postcode']))

street = pd.DataFrame(['UnnamedRoad,LlandeiloSA196UA,UK', '8NewRd,LlandeiloSA196DB,UK','1RomanRd,Banwen,NeathSA109LH,UK', 'UnnamedRoad,LlangadogSA199UN,UK', '48ColeAve,ChadwellStMary,GraysRM164JQ,UK', '37WellingtonRd,NorthWealdBassett,EppingCM166JY,UK'], columns=(['address']))

dictframe = {}
for index, i in enumerate(test['postcode']):
    dictframe[i] = list()
    #for k in range(0, len(street), 1):    
    dictframe[i].append(list(filter(lambda x: test['postcode'][index] in x, street['address'])))
 

Выход-

 {'KY6': [[]],
 'M16': [['48ColeAve,ChadwellStMary,GraysRM164JQ,UK',
   '37WellingtonRd,NorthWealdBassett,EppingCM166JY,UK']],
 'SA1': [['UnnamedRoad,LlandeiloSA196UA,UK',
   '8NewRd,LlandeiloSA196DB,UK',
   '1RomanRd,Banwen,NeathSA109LH,UK',
   'UnnamedRoad,LlangadogSA199UN,UK']],
 'SR2': [[]],
 'SR6': [[]]}