熊猫-查找2个相关属性的最大数量,并用该值替换重复的行

时间:2018-06-19 18:35:55

标签: python pandas dataframe pandas-groupby

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

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值相关。

我正在尝试用该场所中最高的类别来替换该场所的场所CategoryId和场所Category。

我想要得到的结果:

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

我试图在“ venueId”列上使用groupby进行分组并找到计数,并用最高计数代替。但是我不知道如何在熊猫中将venueCategoryId和venueCategory作为依赖列来查找最多2列并替换它们。

1 个答案:

答案 0 :(得分:1)

这是通过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