如何解决如何分组并获得三个最频繁的值?
我想按ID分组并获得三个最频繁的城市。例如我有原始数据框
ID City
1 London
1 London
1 New York
1 London
1 New York
1 Berlin
2 Shanghai
2 Shanghai
我想要的结果是这样的:
ID first_frequent_city second_frequent_city third_frequent_city
1 London New York Berlin
2 Shanghai NaN NaN
解决方法
第一步是对每个City
使用SeriesGroupBy.value_counts
来计算ID
的计数值,优点是已经对值进行了排序,然后按GroupBy.cumcount
得到计数器,首先过滤{{1 }}的值以3
表示,以DataFrame.pivot
进行透视,更改列名,最后通过DataFrame.reset_index
将loc
转换为列:
ID
,
使用count
作为引用进行排序的另一种方法,然后通过遍历groupby
对象来重新创建数据帧:
df = (df.assign(count=df.groupby(["ID","City"])["City"].transform("count"))
.drop_duplicates(["ID","City"])
.sort_values(["ID","count"],ascending=False))
print (pd.DataFrame([i["City"].unique()[:3] for _,i in df.groupby("ID")]).fillna(np.NaN))
0 1 2
0 London New York Berlin
1 Shanghai NaN NaN
,
有点长,实际上是两次分组,第一部分的工作原理是分组以升序对数据进行排序,第二部分使我们可以将数据分为几列:
(df
.groupby("ID")
.tail(3)
.drop_duplicates()
.groupby("ID")
.agg(",".join)
.City.str.split(",",expand=True)
.set_axis(["first_frequent_city","second_frequent_city",third_frequent_city"],axis="columns",)
)
first_frequent_city second_frequent_city third_frequent_city
ID
1 London New York Berlin
2 Shanghai None None
,
分别通过.count
和ID
获得City
,然后将np.where()
与.groupby()
,max
和{ {1}}。然后将索引设置为行,然后将行堆积到median
列上的列中。
min
输出:
max
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。