如何在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
相关产品推荐
相关产品推荐

