Панды - найдите максимальное количество 2 зависимых атрибутов и замените дублирующиеся строки этим значением

1

Я работаю в пандах, и у меня есть набор данных /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 столбца и заменить их.

Теги:
pandas
dataframe
pandas-groupby

1 ответ

1
Лучший ответ

Здесь одно решение через 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
  • 0
    Это делает большую часть работы. Единственная проблема, которая осталась, заключалась в том, что когда номер venueCategoryId одинаков (например: v1 вместо того, чтобы иметь vc1 дважды, он имеет его только один раз). Затем он сохраняет и vc1, и vc2, я хотел, чтобы любой из них не имел значения, какой именно.
  • 0
    @KevinStephenBiswas, извините, я не понимаю. Может быть, вы можете привести пример, демонстрирующий, где желаемый результат отличается от метода, который я описал?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню