使用Pandas groupby遇TypeError:不可哈希类型'series'/'numpy.ndarray'的问询
解决Pandas GroupBy中的
TypeError: unhashable type问题 正确代码示例
首先修正分组键的传递方式,将多个分组键放入列表中,或者先生成处理后的新列再分组:
# 方式1:直接用列表包裹处理后的日期序列和列名 session_cnt = df.groupby( [df['EVENT_DATETIME'].dt.date, 'CUSTOMER_ID'] ).agg( session_count=('SESSION_ID', 'nunique'), app_session_cnt=('APP_SESSION_ID', 'nunique') ).reset_index() # 方式2:先生成日期列,再用列名分组(更清晰) df['EVENT_DATE'] = df['EVENT_DATETIME'].dt.date session_cnt = df.groupby(['EVENT_DATE', 'CUSTOMER_ID']).agg( session_count=('SESSION_ID', 'nunique'), app_session_cnt=('APP_SESSION_ID', 'nunique') ).reset_index()
错误原因解析
第一次错误:
TypeError: unhashable type 'series'
你直接用逗号分隔传递两个Series作为分组键,但Pandas要求多个分组键必须用列表包裹。未包裹的情况下,第二个Series被误判为其他参数,而Series是可变不可哈希对象,因此触发错误。第二次错误:
TypeError: unhashable type 'numpy.ndarray'df['CUSTOMER_ID'].values返回的numpy数组属于可变不可哈希对象,不符合分组键的要求。
出现该错误时的必查项
- 分组键的类型:确保分组键是可哈希类型(字符串、数值、datetime、元组等),禁止直接传入
Series、numpy数组、列表、字典这类不可哈希的可变对象。如果需要使用处理后的列(如提取日期),将其放入列表中作为分组键即可。 - 分组参数的格式:多个分组键必须用列表(或元组)包裹,不能直接逗号分隔。
groupby的by参数仅接受单个分组键,或包含多个分组键的可迭代容器。 - 分组列的元素类型:检查分组列的元素是否包含不可哈希值(如列表、字典)。可以用
df['目标列'].apply(type).unique()查看元素类型,排查异常值。 - 参数传递是否混淆:避免将分组键误传给
groupby的其他参数(如axis),这会导致类型不匹配的错误。
内容的提问来源于stack exchange,提问作者march_1
相关产品推荐
相关产品推荐

