У меня есть набор данных с отформатированным JSON столбцом «location», который выглядит следующим образом:
{"id":2442047,"name":"Los Angeles","slug":"los-angeles-ca","short_name":"Los Angeles, CA","displayable_name":"Los Angeles, CA","localized_name":"Los Angeles","country":"US","state":"CA","type":"Town","is_root":false,"expanded_country":"United States","urls":{"web":{"discover":"https://www.kickstarter.com/discover/places/los-angeles-ca","location":"https://www.kickstarter.com/locations/los-angeles-ca"},"api":{"nearby_projects":"https://api.kickstarter.com/v1/discover?signature=1584060704.9ef7b4f3e8e8affb0f28c150bc4bb5cc70e2953d&woe_id=2442047"}}}
Я извлек «state», «name» и «type» и добавил их в отдельных столбцах. Однако в целом слишком много городов (800i sh), и я не могу получить макеты для всех из них, поскольку мой набор данных будет слишком большим для обработки, и это не будет иметь смысла.
Чтобы решить эту проблему, я думаю сохранить только названия городов, в которых они находятся в топ 3 каждого штата, иначе они будут сгруппированы как «другие». Например, в Орегоне будут сохранены только «Портленд», «Евгений» и «Салем», а другие будут сгруппированы как «другие».
Пример кадра данных:
In [1]: df = pd.DataFrame([[Portland, OR], [Eugene, OR], [Salem, OR], [Bend, OR], [Albany, OR], [Eugene, OR], [Portland, OR], [Portland, OR], [Portland, OR], [Salem, OR], []Eugene, OR], [Portland, OR]], columns=['City', 'State'])
А вот вывод:
In [2]: df
Out [2]:
City State
0 Portland OR
1 Eugene OR
2 Salem OR
3 Bend OR
4 Albany OR
5 Eugene OR
6 Portland OR
7 Portland OR
8 Salem OR
9 Eugene OR
10 Portland OR
И вот что ожидается на выходе:
City State
0 Portland OR
1 Eugene OR
2 Salem OR
3 Others OR
4 Others OR
5 Eugene OR
6 Portland OR
7 Portland OR
8 Salem OR
9 Eugene OR
10 Portland OR
Вот мои коды для извлечения атрибутов и добавления их в фрейм данных:
city_pattern = r'"name":"([^"]+)"'
city_type_pattern = r'"type":"([^"]+)"'
state_pattern = r'"state":"([^"]{2})"' # limit result to 2 characters
city = []
city_type = []
state = []
for i in test_df['location']:
try:
state_result = re.search(state_pattern, str(i)).group(1)
except:
state_result = "null"
try:
city_result = re.search(city_pattern, str(i)).group(1)
except:
city_result = "null"
try:
city_type_result = re.search(city_type_pattern, str(i)).group(1)
except:
city_type_result = "null"
print(city_result, city_type_result, state_result)
city.append(str(city_result))
city_type.append(str(city_type_result))
state.append(str(state_result))
test_df['city'] = city
test_df['city_type'] = city_type
test_df['state'] = state
Можно ли как-нибудь подсчитать частоту городов в каждом штате и изменить названия не входящие в топ-3 часто встречающиеся города для «других»? Или есть ли другие лучшие способы справиться со всеми этими 800i sh различными названиями городов? Это граничило со мной в течение многих дней, и я был бы очень признателен за любую помощь! Спасибо ~