Как сгруппировать / выполнить повторную выборку столбца на основе строк, а не по формату времени, как известно из повторной выборки pandas

#python #pandas #dataframe #grouping

Вопрос:

Я хотел бы попросить вас о небольшой поддержке. Я использовал API google place, чтобы получить отформатированные адреса некоторых поставщиков.

Моя цель-проверить адреса из необработанных данных и сравнить их с теми, которые предлагает Google.

Поэтому мне удалось создать фрейм из данных, предоставленных Google, со столбцами (Имя, street_Google, ZIP_Google, Country_Google).

Мой файл raw также имеет аналогичную структуру (имя, street_raw)

Чтобы проверить, похожи ли адреса, я выполняю нечеткое сравнение, в котором сравниваю улицы друг с другом и помещаю данные в столбец. На изображении ниже показан мой выходной файл excel с Street_X в качестве необработанной улицы, Street_Y данные, предоставленные Google, и сходство в качестве нечеткого результата

Вот шаг, на который я не могу пойти дальше и был бы рад любой поддержке.

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

Результатом,например, должно быть: сохранить строку[0], строку[2], [3], строку[4] в соответствующих столбцах введите описание изображения здесь

Я попробовал использовать функцию groupby, однако она создает несколько индексов

Пожалуйста, найдите ниже мой код

 from pprint import pprint from thefuzz import fuzz import pandas as pd import requests import googlemaps from urllib.parse import urlencode API_KEY="API" map_client=googlemaps.Client(API_KEY)   vendor_data_pl=pd.read_excel(path)   supplier_name=vendor_data_pl["Supplier name"][:10] #supplier_name=["HELLMANN WORLDWIDE LOGISTICS POLSKA SP. Z O.O. SP. K.","SIEMENS SP. Z O.O."] supplier_list=[] address_list=[] phone_list=[]  for name in supplier_name:  response=map_client.places(query=name)  results=response.get("results")  MultipleLocation=len(results)  if MultipleLocationgt;= 1:  for i in range (MultipleLocation):  PlaceID=results[i]["place_id"]  url="https://maps.googleapis.com/maps/api/place/details/json"  params={  "key":API_KEY,  "place_id":PlaceID,  "inputtype":"textquery",  "language":"en"  }  params_encoded=urlencode(params)  places_endpoint=f"{url}?{params_encoded}"  r=requests.get(places_endpoint)   streetname=r.json()["result"]['formatted_address']  address_list.append(streetname)  supplier_list.append(name)  try:  phoneNumber=r.json()["result"]['international_phone_number']  phone_list.append(phoneNumber)  except:  phoneNumberNA="N.A"  phone_list.append(phoneNumberNA)       DataFrame=pd.DataFrame({"Suppliername":supplier_list,"address":address_list,"PhoneNumber":phone_list}) indexDrop=DataFrame[DataFrame["address"]=="No address found"].index DataFrame=DataFrame.drop(indexDrop)  address=DataFrame["address"].str.split(",", expand=True) expansion1=address[0].str.split("(.*?)s*(d (?:[/-]d )?)?$",expand=True) ZipCity=address[1].str.split(" ", expand=True) DataFrame["City"] = ZipCity[2] DataFrame["Street"]=expansion1[1] DataFrame["Streetnumber"]=expansion1[2] DataFrame["Zip"] = ZipCity[1] DataFrame["Country"]=address[2]  merged_frame=pd.merge(vendor_data_pl,DataFrame,on="Supplier name") zipaddress=zip(merged_frame["Street_x"].values,merged_frame["Street_y"].values) similarity=[] for x,y in zipaddress:  similarity.append(fuzz.ratio(x,y))  merged_frame["Similarity"]=similarity merged_frame=merged_frame[["Supplier name","Street_x","Street_y","Similarity","Streetnumber","City postal code","Zip","Country","PhoneNumber"]]   

Ответ №1:

Вот простое аккуратное решение:

 df.sort_values('Similarity', ascending=False).drop_duplicates('Supplier Name')  

Если бы у вас были тысячи строк, это было бы не слишком эффективно, так как требует сортировки, но все равно не так уж плохо и довольно аккуратно.

Эффективный способ сделать это по-прежнему довольно прост, поэтому используйте то, что вам больше нравится:

 df.loc[df.groupby('Supplier Name')['Similarity'].idxmax()]  

Это все еще включает сортировку, но только внутри групп, поэтому в масштабе это было бы более эффективно.

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

1. Большое спасибо, мой друг. Действительно помог мне