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

Pandas DataFrame按分组条件新增列报Series不可哈希错误如何解决

问题解答

1. 报错原因

  • groupby.get_group() 方法要求传入的参数是单个分组的哈希键标量值(比如你测试时传入的整数20110427),但你批量处理时传入了result['ddate']这个完整的Series对象
  • Series是可变对象,Python不允许可变对象作为哈希键使用,因此直接抛出'Series' objects are mutable, thus they cannot be hashed错误
  • 即使没有哈希报错,你的原有写法也无法实现需求:原有写法是全局过滤条件,而非在每个分组内针对当前行的dsteps做判断计算

2. 正确实现代码

可以用分组后逐行计算的逻辑实现需求,代码如下:

# 按ddate分组后,对每个分组内的每一行,计算符合条件的ttime最小值
result['dtime'] = result.groupby('ddate', group_keys=False).apply(
    # 对每个日期分组g,遍历每一行计算对应dtime
    lambda g: g.apply(
        lambda row: g.loc[g['L'] < row['dsteps'], 'ttime'].min(), 
        axis=1
    )
)

如果数据量较大,想要优化性能,可以提前把每个分组的字段转为数组用广播计算,避免两层apply的开销,示例如下:

import numpy as np

def calc_group_dtime(g):
    L_arr = g['L'].values
    ttime_arr = g['ttime'].values
    dsteps_arr = g['dsteps'].values
    # 广播生成布尔矩阵:每行对应一个dsteps,判断所有L是否小于该dsteps
    mask = L_arr < dsteps_arr[:, None]
    # 对每行找符合条件的最小ttime,没有符合条件的返回NaN
    return [ttime_arr[m].min() if m.any() else np.nan for m in mask]

result['dtime'] = result.groupby('ddate', group_keys=False).apply(calc_group_dtime)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:15:00