首页 > 解决方案 > Pandas - 查找 2 个相关属性的最大计数并用该值替换重复行

问题描述

我在熊猫工作,我有一个看起来像这样的数据集/数据框。

venueId                     venueCategoryId             venueCategory
v1                          vc1                         Airport
v1                          vc2                         Park     
v1                          vc1                         Airport
v2                          vc3                         American Restaurant
v3                          vc4                         Italian Restaurant
v3                          vc5                         Restaurant

场地Id 代表独特的场地,类别代表场地的类型。CategoryId 和 CategoryName 值是相关的。

我正在尝试用该场地中最高的类别替换场地的场地类别 ID 和场地类别。

我试图得到的结果:

venueId                     venueCategoryId             venueCategory
v1                          vc1                         Airport
v2                          vc3                         American Restaurant
v3                          vc4                         Italian Restaurant

我试图在“venueId”列上使用 groupby 来分组并找到计数并替换为最高计数。但我不知道如何将 placeCategoryId 和 placeCategory 作为 pandas 中的依赖列并找到最多 2 列并替换它们。

标签: pythonpandasdataframepandas-groupby

解决方案


这是通过pd.Series.mode. 可能有一种更 Pandorable 的方法。

# 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

推荐阅读