如何获取Pandas DataFrame中每月访问量最高的house_id
问题描述
拥有如下Pandas DataFrame:
visit_date|house_id ----------+--------- 2017-12-27|892815605 2018-01-03|892807836 2018-01-03|892815815 2018-01-03|892812970 2018-01-03|892803143 2018-01-03|892815463 2018-01-03|892816168 2018-01-03|892814475 2018-01-03|892813594 2018-01-03|892813557 2018-01-03|892809834 2018-01-03|892809834 2018-01-03|892803143 2018-01-03|892803143 2018-01-03|892800500 2018-01-03|892806236 2018-01-03|892810789 2018-01-03|892797487 2018-01-03|892815182 2018-01-03|892814514 2018-01-03|892778046 2018-01-03|892809386 2018-01-03|892816048 2018-01-03|892816048 2018-01-03|892816078 2018-01-03|892810643
需要找出每个月访问量最高的房屋ID(house_id)。尝试过groupby操作但未得到预期结果,也试过逐个月份查询,但想找更高效的实现方式,同时希望能将月份数字对应为英文月份名称(如1对应January)。
解决方案
步骤1:处理日期,提取月份信息
先确保visit_date为datetime类型,再提取月份数字和英文名称:
import pandas as pd # 转换日期列格式 df_1['visit_date'] = pd.to_datetime(df_1['visit_date']) # 添加月份数字列 df_1['month_num'] = df_1['visit_date'].dt.month # 添加英文月份名称列 df_1['month_name'] = df_1['visit_date'].dt.month_name()
步骤2:统计各房屋每月访问量
按月份(数字+名称)和房屋ID分组,统计访问次数:
# 分组统计,并重命名计数列 monthly_counts = df_1.groupby(['month_num', 'month_name', 'house_id'])['visit_date'].count().rename('visit_count').reset_index()
步骤3:筛选每月访问量最高的房屋
提供两种高效实现方式,无需手动循环:
方法1:用idxmax定位最大值行
# 按月份分组,找到访问量最大的行索引 max_indices = monthly_counts.groupby('month_num')['visit_count'].idxmax() # 提取对应行并按月份排序 top_houses = monthly_counts.loc[max_indices].sort_values('month_num')
方法2:用rank筛选排名第一的记录
# 按月份分组,对访问量降序排名(first表示并列时取最先出现的) monthly_counts['rank'] = monthly_counts.groupby('month_num')['visit_count'].rank(ascending=False, method='first') # 筛选排名第一的记录并排序 top_houses = monthly_counts[monthly_counts['rank'] == 1].sort_values('month_num').drop('rank', axis=1)
结果说明
处理后top_houses会包含以下信息:
| month_num | month_name | house_id | visit_count |
|---|---|---|---|
| 12 | December | 892815605 | 1 |
| 1 | January | 892803143 | 3 |
- 若同一月份有多个房屋访问量并列最高,可将
rank的method参数改为min,这样所有并列第一的记录都会被保留。 - 上述方法一次性处理所有月份,比逐个查询效率高得多。
内容的提问来源于stack exchange,提问作者Bruhlickd
相关产品推荐
相关产品推荐

