You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DataFrame中从指定起点反向定位符合条件值并计算占比列

解决方案

针对需求,我们可以用pandas实现反向定位并计算的逻辑,具体步骤如下:

1. 构造示例DataFrame

首先还原题目中的示例数据:

import pandas as pd

data = {
    'index': [1, 2, 3, 4],
    'ItemName': ['toyHorse', 'toyDog', 'toyCat', 'toyHorse'],
    'Price': [2.99, 2.50, 2.75, 5.00],
    'Source': ['Japan', 'Cambodia', 'China', 'Japan'],
    'Cost': [2.25, 1.80, 1.10, 3.75]
}
df = pd.DataFrame(data).set_index('index')

2. 预存每行之前最近的符合条件的Cost值

遍历DataFrame,记录每行之前最后一个满足ItemName='toyHorse'且Source='Japan'的Cost值:

last_valid_cost = None
prev_valid_costs = []

for _, row in df.iterrows():
    prev_valid_costs.append(last_valid_cost)
    # 更新最近的有效Cost值
    if row['ItemName'] == 'toyHorse' and row['Source'] == 'Japan':
        last_valid_cost = row['Cost']

df['last_prev_valid_cost'] = prev_valid_costs

3. 筛选目标行并计算比值

筛选出ItemName='toyHorse'且Price>=5.00的行,计算last_prev_valid_cost/Price得到PastPricePoint:

# 筛选目标行并复制,避免修改原DataFrame
target_df = df[(df['ItemName'] == 'toyHorse') & (df['Price'] >= 5.00)].copy()
target_df['PastPricePoint'] = target_df['last_prev_valid_cost'] / target_df['Price']

# 提取所需列作为最终结果
result = target_df[['ItemName', 'Price', 'PastPricePoint']]
print(result)

输出结果

运行后得到的结果与需求一致:

ItemName  Price  PastPricePoint
index                                  
4        toyHorse    5.0            0.45

说明

  • 遍历方法的优势是效率更高,尤其在处理大数据集时,避免了apply带来的性能损耗
  • 如果没有找到符合条件的前置行,last_prev_valid_cost会是None,此时PastPricePoint也会是NaN,可根据需求补充处理逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:29:49