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

如何在Pandas分组中比较指定值行的索引/时间先后

问题

  • 如何在groupby分组内,比较不同列中某行的索引或date_time是否晚于另一行?
  • 如何判断mfe_long_return = 33.25的行是否在mae_long_return = -15.00的行之前(通过索引或时间戳)?
  • 需要按df.groupby(['date', 'buy_dom','_buy_aggression_pivot'])分组,在组内筛选对应的mfe_long_return和mae_long_return记录。

尝试的代码

df.loc[(df.groupby(['date', 'buy_dom','_buy_aggression_pivot',df['mfe_long_return'] > 0])['mfe_long_return'].transform('min') >= 29, 'date_time')] >= df.loc[(df.groupby(['date', 'buy_dom','_buy_aggression_pivot',df['mae_long_return'] < 0])['mae_long_return'].transform('min') <= -15, 'date_time')]

报错信息

Can only compare identically-labeled Series objects

数据示例

date_timedatebuy_dom_buy_aggression_buy_aggression_pivotmfe_long_returnmae_long_return
1132021-11-29 04:00:492021-11-29 00:00:0016172.7516172.7516172.75nannan
1142021-11-29 04:05:342021-11-29 00:00:0016172.750.0016172.75nannan
1152021-11-29 04:11:482021-11-29 00:00:0016172.750.0016172.75nannan
1162021-11-29 04:19:012021-11-29 00:00:0016172.750.0016172.7533.25nan
1172021-11-29 04:24:222021-11-29 00:00:0016172.750.0016172.75nannan
1182021-11-29 04:30:132021-11-29 00:00:0016172.750.0016172.75nannan
1192021-11-29 04:36:142021-11-29 00:00:0016172.750.0016172.75nannan
1202021-11-29 04:41:022021-11-29 00:00:0016172.750.0016172.75nannan
1212021-11-29 04:51:202021-11-29 00:00:0016172.750.0016172.75nannan
1222021-11-29 04:56:332021-11-29 00:00:0016172.750.0016172.75nannan
1232021-11-29 05:02:132021-11-29 00:00:0016172.750.0016172.75nannan
1242021-11-29 05:08:202021-11-29 00:00:0016172.750.0016172.75nannan
1252021-11-29 05:17:342021-11-29 00:00:0016172.750.0016172.75nan-15.00
1262021-11-29 05:25:332021-11-29 00:00:0016172.750.0016172.75nannan
1272021-11-29 05:33:102021-11-29 00:00:0016172.750.0016172.75nannan
1282021-11-29 05:45:452021-11-29 00:00:0016172.750.0016172.75nannan
1292021-11-29 05:55:032021-11-29 00:00:0016172.750.0016172.75nannan

解决方案

报错原因是你筛选出的两个date_time序列索引不匹配,无法直接比较。正确做法是在每个分组内分别提取目标行的时间,再做对比。

1. 定义分组处理函数

写一个函数处理单个分组,筛选符合条件的行并比较时间顺序:

def check_mfe_before_mae(group):
    # 提取mfe_long_return >=29的行的时间
    mfe_times = group[group['mfe_long_return'] >= 29]['date_time']
    # 提取mae_long_return <=-15的行的时间
    mae_times = group[group['mae_long_return'] <= -15]['date_time']
    
    # 两组都有数据时,比较最早的mfe时间是否早于最早的mae时间
    if not mfe_times.empty and not mae_times.empty:
        return mfe_times.min() < mae_times.min()
    # 任意一组无数据时返回False(可根据需求调整)
    return False

2. 应用分组获取结果

将函数应用到分组上,得到每个分组的判断结果:

group_result = df.groupby(['date', 'buy_dom', '_buy_aggression_pivot']).apply(check_mfe_before_mae)

返回结果是一个Series,索引为分组键,值为布尔值,表示该分组内符合条件的mfe行是否早于mae行。

3. (可选)给原DataFrame添加标记

如果需要在原数据中标记每行所属分组是否满足条件,可以将结果合并回去:

# 将分组结果转为字典,方便快速查找
result_dict = group_result.to_dict()
# 添加新列
df['mfe_before_mae'] = df.apply(
    lambda row: result_dict[(row['date'], row['buy_dom'], row['_buy_aggression_pivot'])],
    axis=1
)

错误解析

你之前的代码把mfe_long_return>0这类条件加入了groupby的分组键,导致分组被不必要地拆分,同时两次筛选得到的Series索引无法对齐,因此触发了Can only compare identically-labeled Series objects错误。正确的逻辑是先按指定字段分组,再在组内筛选目标行进行比较。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:43:26