You need to enable JavaScript to run this app. 如何在Pandas DataFrame中查找特定元素并计算往返机票总价
优惠活动
大模型
产品
解决方案
定价
更多

如何在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())

原有代码优化点

  1. 不要用sum作为变量名,会覆盖Python内置的sum函数,容易引发未知错误
  2. pandas场景下尽量避免嵌套循环遍历,十万级以上数据量下,嵌套循环耗时是向量化操作的上千倍
  3. 多条件判断中的&是位运算符,每个条件都需要用括号包裹,否则会出现逻辑优先级错误
  4. 你写的exists = x in ...属于语法错误,in判断直接返回布尔值,不需要赋值后再判断

内容的提问来源于stack exchange,提问作者chedreem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 03:15:03