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

