Я работаю в пандах, и у меня есть набор данных /dataframe, который выглядит так.
venueId venueCategoryId venueCategory
v1 vc1 Airport
v1 vc2 Park
v1 vc1 Airport
v2 vc3 American Restaurant
v3 vc4 Italian Restaurant
v3 vc5 Restaurant
venueId представляет собой уникальные места и категории, представляющие, какой тип места проведения. Значения CategoryId и CategoryName связаны.
Я пытаюсь заменить placeCategoryId и venueCategory в месте проведения с категорией, которая была самой высокой в этом месте.
Результат, который я пытаюсь получить:
venueId venueCategoryId venueCategory
v1 vc1 Airport
v2 vc3 American Restaurant
v3 vc4 Italian Restaurant
Я пытался использовать groupby в столбце 'siteId' для группировки и поиска счетчика и замены с наивысшим счетчиком. Но я не мог понять, как placeCategoryId и venueCategory как зависимый столбец в пандах и найти максимум 2 столбца и заменить их.
Здесь одно решение через pd.Series.mode
. Вероятно, существует более благоприятный метод.
# combine id and category series
df['venueIdCat'] = list(zip(df.venueCategoryId, df.venueCategory))
# groupby venueId and extract mode
res = df.groupby('venueId')['venueIdCat'].apply(pd.Series.mode).reset_index()
# unsplit id and category
res = res.join(pd.DataFrame(res['venueIdCat'].values.tolist(),
columns=['venueCategoryId', 'venueCategory']))
# select required columns
res = res[['venueId', 'venueCategoryId', 'venueCategory']]
print(res)
venueId venueCategoryId venueCategory
0 v1 vc1 Airport
1 v2 vc3 AmericanRestaurant
2 v3 vc4 ItalianRestaurant
Альтернативное решение с использованием collections.Counter
:
from collections import Counter
# combine id and category series
df['venueIdCat'] = list(zip(df.venueCategoryId, df.venueCategory))
# groupby venueId and extract mode
res = df.groupby('venueId')['venueIdCat'].apply(lambda x: Counter(x).most_common()[0][0]).reset_index()
# unsplit id and category
res = res.join(pd.DataFrame(res['venueIdCat'].values.tolist(),
columns=['venueCategoryId', 'venueCategory']))
# select required columns
res = res[['venueId', 'venueCategoryId', 'venueCategory']]
print(res)
venueId venueCategoryId venueCategory
0 v1 vc1 Airport
1 v2 vc3 AmericanRestaurant
2 v3 vc4 ItalianRestaurant