Pandas技术问题:按大小总和对MultIndex(多级索引)排序
解决Pandas分组后按网站总请求数排序多级索引的问题
嘿,这需求不难搞定,我给你一步步拆解:
首先,咱们先把你提供的数据转换成Pandas DataFrame,方便后续操作:
import pandas as pd # 构建你的示例数据 data = [ ("website.com", "1.1.1.1"), ("website.com", "1.1.1.1"), ("website.com", "1.1.1.1"), ("website.com", "1.1.1.1"), ("website.com", "1.1.1.2"), ("website1.com", "1.1.1.1"), ("website1.com", "1.1.1.1"), ("website1.com", "1.1.1.3"), ("website1.com", "1.1.1.3"), ("website2.com", "1.1.1.4"), ] df = pd.DataFrame(data, columns=["website", "ip"])
接下来,按website和ip分组,统计每个组合的请求次数,这时候会自动生成多级索引(MultiIndex):
# 分组并统计每个(网站, IP)组合的请求次数 grouped_counts = df.groupby(["website", "ip"]).size()
现在你需要按「网站的总请求数」来排序这个多级索引,同时每个网站下再按IP的请求数排序。咱们可以先算出每个网站的总请求量,再用它作为排序的核心依据:
# 先计算每个网站的总请求数 website_total = df.groupby("website").size() # 执行排序:第一优先级是网站总请求数(降序),第二优先级是IP的请求数(降序) sorted_result = grouped_counts.sort_values( key=lambda x: [website_total[x.index.get_level_values(0)], x], ascending=[False, False] )
如果你更习惯看DataFrame格式的结果,可以把它转成带多级索引的DataFrame:
# 转换成DataFrame并重新设置多级索引 sorted_df = sorted_result.reset_index(name="request_count").set_index(["website", "ip"])
运行后,sorted_result的输出会是这样的:
website.com 1.1.1.1 4 1.1.1.2 1 website1.com 1.1.1.1 2 1.1.1.3 2 website2.com 1.1.1.4 1 dtype: int64
完全符合你想要的:先按网站的总请求量从多到少排序,每个网站内部再按IP的请求数排序~
内容的提问来源于stack exchange,提问作者pythad
相关产品推荐
相关产品推荐

