如何用统一函数按市场统计DataFrame中各可用性状态的数量?
解决方案
方法1:生成结构化统计表格(推荐)
不用逐个市场写重复代码,直接用pandas的crosstab就能一步生成所有市场的状态计数,高效还不容易出错:
import pandas as pd def get_all_market_availability_counts(file_path="./_data/users/availabilities.csv"): # 提前定义好要统计的5种可用性状态 target_states = ["available", "in_call", "offline", "do_not_disturb", "after_call_work"] # 读取数据,把availability转成分类类型——确保哪怕某市场没有某状态,统计结果里也会保留该列(值为0) df = pd.read_csv(file_path, encoding='ISO-8859-1') df['availability'] = pd.Categorical(df['availability'], categories=target_states) # 交叉统计:行是市场,列是状态,值为对应数量 return pd.crosstab(df['market'], df['availability'], dropna=False)
调用这个函数后,会返回一个规整的DataFrame,直接就能看到每个市场下所有状态的计数,没有的状态自动填0。
方法2:返回字典格式结果(按需选用)
如果需要用字典格式获取每个市场的状态统计,基于上面的函数改一下就行:
def get_availability_counts_dict(file_path="./_data/users/availabilities.csv"): count_df = get_all_market_availability_counts(file_path) # 把DataFrame转成字典:key是市场名,value是该市场的状态计数字典 return count_df.to_dict('index')
为什么比原代码好?
- 不管有10个还是100个市场,一次调用就能完成所有统计,完全避免冗余代码;
- 用
pd.Categorical强制指定统计范围,不会漏掉任何需要统计的状态; - 代码简洁易维护,后续要加新状态,只需要修改
target_states列表就行。
示例输出(用你给的测试数据)
调用get_all_market_availability_counts()会得到:
| market | available | in_call | offline | do_not_disturb | after_call_work |
|---|---|---|---|---|---|
| dach | 3 | 0 | 0 | 0 | 0 |
| fr | 1 | 2 | 0 | 0 | 0 |
| nl | 0 | 0 | 2 | 0 | 0 |
内容的提问来源于stack exchange,提问作者NoobDev
相关产品推荐
相关产品推荐

