如何在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_time | date | buy_dom | _buy_aggression | _buy_aggression_pivot | mfe_long_return | mae_long_return | |
|---|---|---|---|---|---|---|---|
| 113 | 2021-11-29 04:00:49 | 2021-11-29 00:00:00 | 16172.75 | 16172.75 | 16172.75 | nan | nan |
| 114 | 2021-11-29 04:05:34 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 115 | 2021-11-29 04:11:48 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 116 | 2021-11-29 04:19:01 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | 33.25 | nan |
| 117 | 2021-11-29 04:24:22 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 118 | 2021-11-29 04:30:13 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 119 | 2021-11-29 04:36:14 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 120 | 2021-11-29 04:41:02 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 121 | 2021-11-29 04:51:20 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 122 | 2021-11-29 04:56:33 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 123 | 2021-11-29 05:02:13 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 124 | 2021-11-29 05:08:20 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 125 | 2021-11-29 05:17:34 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | -15.00 |
| 126 | 2021-11-29 05:25:33 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 127 | 2021-11-29 05:33:10 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 128 | 2021-11-29 05:45:45 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
| 129 | 2021-11-29 05:55:03 | 2021-11-29 00:00:00 | 16172.75 | 0.00 | 16172.75 | nan | nan |
解决方案
报错原因是你筛选出的两个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
相关产品推荐
相关产品推荐

