如何为DataFrame添加MRT票价列与统一票价列?求替代iterrows的方法
给DataFrame新增票价列的可行方法
1. 新增single trip列(统一票价)
这一步操作最简单,直接赋值即可:
df['single trip'] = 6900
2. 新增MRT票价列(按人群分档)
推荐使用向量化操作,比iterrows效率更高且不易出错,以下是几种常用实现方法:
方法一:用np.select(多条件场景清晰直观)
先导入numpy库,定义匹配条件和对应票价(把示例中的票价数值替换成你的实际业务数据):
import numpy as np # 定义各群体的匹配条件 conditions = [ df['concession_type'] == 1200, # 学生群体 df['concession_type'] == 4050, # 国家服役人员/成人 df['concession_type'] == 2070 # 老年人 ] # 对应各群体的MRT票价(示例数值,替换为实际票价) fare_values = [1.0, 1.5, 0.7] # 生成MRT票价列,default处理未匹配的特殊情况 df['MRT票价'] = np.select(conditions, fare_values, default=1.5)
方法二:用字典映射(代码简洁易维护)
构建concession_type到对应票价的映射字典,再用map批量赋值:
# 构建类型-票价映射字典 fare_map = { 1200: 1.0, # 学生票价 4050: 1.5, # 成人/国家服役人员票价 2070: 0.7 # 老年人票价 } # 生成MRT票价列,fillna处理未在字典中的特殊类型 df['MRT票价'] = df['concession_type'].map(fare_map).fillna(1.5)
方法三:用apply(适合复杂逻辑,效率略低)
如果需要更复杂的判断逻辑,可以用apply实现,但不建议用于超大数据集:
def calculate_mrt_fare(row): if row['concession_type'] == 1200: return 1.0 elif row['concession_type'] == 4050: return 1.5 elif row['concession_type'] == 2070: return 0.7 else: return 1.5 # 默认返回成人票价 df['MRT票价'] = df.apply(calculate_mrt_fare, axis=1)
注:
iterrows容易失败的原因是它返回的是行数据的副本,直接修改不会同步到原DataFrame,而且逐行迭代的效率远低于向量化操作,因此优先使用上述方法。
内容的提问来源于stack exchange,提问作者mobly elliot
相关产品推荐
相关产品推荐

