如何在Pandas DataFrame中查找特定元素并计算往返机票总价
实现往返航线价格匹配求和的方案
基础判断方法
要查找DataFrame中是否包含指定值,不需要循环遍历,直接用pandas内置的布尔判断即可:
- 判断单个值
x是否存在于某一列:直接使用x in df['列名'].values,返回布尔类型结果 - 判断是否存在同时满足多个条件的行:用
(条件1) & (条件2).any(),示例如下:
# 判断是否存在x到y的正向航线 has_forward = ((df1['CityCode_From'] == x) & (df1['CityCode_To'] == y)).any() # 判断是否存在y到x的反向航线 has_reverse = ((df1['CityCode_From'] == y) & (df1['CityCode_To'] == x)).any() # 判断df2的flight列是否存在y-x格式的航线 has_reverse_flight = (df2['flight'] == f"{y}-{x}").any()
如果需要提取符合条件的对应值,直接用布尔索引取值即可:
# 提取y-x航线的coupons值,不存在的话返回空 reverse_coupon = df2.loc[df2['flight'] == f"{y}-{x}", 'coupons'].iloc[0] if has_reverse_flight else 0
往返航线求和完整实现
完全不需要嵌套循环,用pandas向量化操作实现,运行效率远高于逐行遍历:
import pandas as pd # 假设df2的flight列为「出发-到达」格式,存储对应coupons值 # 1. 拆分航线为出发、到达两个独立字段 df2[['dep', 'arr']] = df2['flight'].str.split('-', expand=True) # 2. 关联匹配反向航线的coupons值 df2 = df2.merge( df2[['dep', 'arr', 'coupons']].rename(columns={'dep':'arr', 'arr':'dep', 'coupons':'reverse_coupons'}), on=['dep', 'arr'], how='left' ) # 3. 计算往返总coupons,无反向航线的话反向值填0 df2['total_coupons'] = df2['coupons'] + df2['reverse_coupons'].fillna(0) # 4. 可选:如果需要每条往返航线只保留一条记录(A-B和B-A合并为同一条) df2['route_key'] = df2.apply(lambda row: '-'.join(sorted([row['dep'], row['arr']])), axis=1) sum_df = df2.drop_duplicates('route_key')[['route_key', 'total_coupons']] print(sum_df.head())
原有代码优化点
- 不要用
sum作为变量名,会覆盖Python内置的sum函数,容易引发未知错误 - pandas场景下尽量避免嵌套循环遍历,十万级以上数据量下,嵌套循环耗时是向量化操作的上千倍
- 多条件判断中的
&是位运算符,每个条件都需要用括号包裹,否则会出现逻辑优先级错误 - 你写的
exists = x in ...属于语法错误,in判断直接返回布尔值,不需要赋值后再判断
内容的提问来源于stack exchange,提问作者chedreem
相关产品推荐
相关产品推荐

