我正在熊猫工作,我有一个像这样的数据集/数据框。
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列并替换它们。
答案 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