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

DataFrame.apply(raw=True)未生效?为何仍传递Series而非numpy数组

pandas apply(raw=True)为啥还是传Series,导致哈希报错?

嘿,我来帮你捋捋这个问题——你遇到的错误其实是两个小问题叠加导致的,咱们一个个拆解:

1. 首先,你选列的方式错了!

你写的temp = df['field1', 'field2']根本不是pandas里选取多列的正确姿势(除非你的DataFrame列是多层索引MultiIndex)。在普通的单层列索引下,这行代码要么直接抛出KeyError,要么意外返回了一个Series,而不是你想要的包含两列的DataFrame。

选多列必须用双层方括号:

temp = df[['field1', 'field2']]

只有这样,temp才是正经的DataFrame,后续按行处理数据时才会符合预期。

2. pandas 0.22版本中raw=True的小坑

就算你选对了列,0.22版本的raw=True也有个限制:它只有在你调用NumPy原生函数的时候,才会老老实实传递numpy数组;但你用的是Python内置的hash(),这不是NumPy函数,所以pandas还是会把Series传给你的lambda,自然就触发了"可变对象不能哈希"的错误。

解决方案:两个靠谱选项

方案一:把行转成元组再哈希

既然hash()能处理不可变的元组,咱们先把每行数据转成元组就行:

df["hash"] = df[['field1', 'field2']].apply(lambda x: hash(tuple(x)), axis=1)

或者拆成两步更清晰:

# 先把每行转成元组
df['tuple_row'] = df[['field1', 'field2']].apply(tuple, axis=1)
# 再计算哈希
df["hash"] = df['tuple_row'].apply(hash)

方案二:用hashlib生成更稳定的哈希(可选)

如果你需要跨会话不变的哈希值(Python内置的hash()每次重启程序都会变化),可以用hashlib库生成更稳定的哈希:

import hashlib

def get_stable_hash(row):
    # 把两列内容拼接成字符串并转成字节
    content = f"{row['field1']}{row['field2']}".encode('utf-8')
    # 用SHA256生成哈希,返回十六进制字符串(也可以用MD5等其他算法)
    return hashlib.sha256(content).hexdigest()

df["hash"] = df.apply(get_stable_hash, axis=1)

总结

你这个问题的核心是一开始选列选错了,导致temp不是DataFrame,apply只能传递Series;再加上0.22版本raw=True对非NumPy函数的支持有限,最终触发了错误。先修正列选取方式,再通过转元组的方式处理哈希,问题就能解决啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:29:34