如何简化循环内的If/elif语句?代码用于Excel城市多维度数据统计
当然有办法简化这些if/elif语句啦!我给你分享几个实用的思路,既能让代码更简洁,也更容易维护:
方法一:用字典映射替代条件判断
如果你的用户类型是固定的(subscribers、customers、其他),可以把类型和对应的统计键做一个映射,这样不用写一堆条件分支,代码逻辑更清晰。
假设你原来的循环逻辑大概是这样:
for row in excel_rows: city = row['city'] user_type = row['user_type'] trip_duration = row['trip_duration'] if user_type == 'subscribers': city_stats[city]['subscribers'] += 1 elif user_type == 'customers': city_stats[city]['customers'] += 1 else: city_stats[city]['others'] += 1 # 计算平均时长的代码...
改成字典映射后会清爽很多:
# 先定义用户类型到统计字段的映射 user_type_map = { 'subscribers': 'subscribers', 'customers': 'customers' } for row in excel_rows: city = row['city'] user_type = row['user_type'] trip_duration = row['trip_duration'] # 用get方法获取对应字段,默认归类到'others' stats_key = user_type_map.get(user_type, 'others') city_stats[city][stats_key] += 1 # 平均时长的计算逻辑...
以后如果要新增用户类型,只需要在user_type_map里加一组键值对就行,不用修改循环内部的代码,维护起来超方便!
方法二:用Pandas分组统计(强烈推荐!)
既然是处理Excel数据,直接用Pandas绝对是最优解——完全抛弃手动循环和条件判断,几行代码就能搞定所有统计需求,效率还高得多。
示例代码如下:
import pandas as pd # 读取Excel文件 df = pd.read_excel('your_excel_file.xlsx') # 按城市分组,一次性统计所有指标 city_stats = df.groupby('city').agg( subscribers=('user_type', lambda x: (x == 'subscribers').sum()), customers=('user_type', lambda x: (x == 'customers').sum()), others=('user_type', lambda x: (~x.isin(['subscribers', 'customers'])).sum()), avg_trip_duration=('trip_duration', 'mean') ).reset_index() # 查看结果 print(city_stats)
这种方法不仅代码量骤减,而且Pandas的分组运算经过优化,处理大数据量时比手动循环快N倍,还能直接把结果导出为Excel或者其他格式,一步到位。
方法三:用defaultdict简化初始化(适合坚持手动循环的场景)
如果因为某些原因必须用手动循环,那可以用collections.defaultdict来自动初始化每个城市的统计数据,避免提前手动判断城市是否存在,让代码更简洁。
示例:
from collections import defaultdict # 初始化统计结构,每个城市默认拥有初始值 city_stats = defaultdict(lambda: { 'subscribers': 0, 'customers': 0, 'others': 0, 'total_duration': 0, 'trip_count': 0 }) # 结合方法一的字典映射 user_type_map = { 'subscribers': 'subscribers', 'customers': 'customers' } for row in excel_rows: city = row['city'] user_type = row['user_type'] trip_duration = row['trip_duration'] stats_key = user_type_map.get(user_type, 'others') city_stats[city][stats_key] += 1 # 累计时长和行程数 city_stats[city]['total_duration'] += trip_duration city_stats[city]['trip_count'] += 1 # 最后计算每个城市的平均时长 for city in city_stats: if city_stats[city]['trip_count'] > 0: city_stats[city]['avg_trip_duration'] = city_stats[city]['total_duration'] / city_stats[city]['trip_count'] else: city_stats[city]['avg_trip_duration'] = 0
这样不用提前为每个城市创建统计项,代码逻辑更流畅。
内容的提问来源于stack exchange,提问作者Godfrey
相关产品推荐
相关产品推荐

