Pandas groupby下比较列值 筛选指定时间点价格利润差值均超历史的名称
实现方案
核心逻辑说明
- 首先需要按
Name维度单独分组计算时序差值,你之前按['Time','Price']分组的逻辑不符合需求,差值计算仅需要同主体内按时序相邻行做差即可 - 计算差值前必须先按
Name+Time排序,保证时间序列顺序正确 - 筛选时注意历史差值仅统计目标时间点之前的记录,避免包含目标时间点自身的差值导致判断逻辑失效
完整可运行代码
import pandas as pd # 1. 构造示例数据(实际使用时替换成自己的DataFrame即可) data = [ ['5:30', 'A', 10, 2], ['5:35', 'A', 12, 3], ['5:40', 'A', 13, 3.5], ['5:30', 'B', 8, 1], ['5:35', 'B', 9, 1.2], ['5:40', 'B', 15, 4] ] df = pd.DataFrame(data, columns=['Time', 'Name', 'price', 'Profit']) # 2. 时间格式处理+排序,保证时序正确 df['Time'] = pd.to_datetime(df['Time'], format='%H:%M').dt.time df = df.sort_values(['Name', 'Time']).reset_index(drop=True) # 3. 按Name分组计算差值,首个时间点填充0 df['diff_price'] = df.groupby('Name')['price'].diff().fillna(0) df['diff_profit'] = df.groupby('Name')['Profit'].diff().fillna(0) # 4. 定义目标时间,筛选符合条件的Name target_time = pd.to_datetime('5:40', format='%H:%M').time() # 统计每个主体目标时间前的历史最大差值 history_max = df[df['Time'] < target_time].groupby('Name').agg( max_diff_price=('diff_price', 'max'), max_diff_profit=('diff_profit', 'max') ).reset_index() # 取目标时间的差值数据关联匹配 target_data = df[df['Time'] == target_time][['Name', 'diff_price', 'diff_profit']] result_df = pd.merge(target_data, history_max, on='Name') # 筛选双差值均超过历史最大值的Name result = result_df[ (result_df['diff_price'] > result_df['max_diff_price']) & (result_df['diff_profit'] > result_df['max_diff_profit']) ]['Name'].tolist() print(result) # 输出示例结果:['B']
内容的提问来源于stack exchange,提问作者Krishna Prasad
相关产品推荐
相关产品推荐

