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

