使用包括 dict 查找在内的函数计算的 pandas 列,“Series”对象是可变的,因此无法对其进行哈希处理

pandas column calculated using function including dict lookup, 'Series' objects are mutable, thus they cannot be hashed

提问人:Tom S 提问时间:4/29/2021 更新时间:4/29/2021 访问量:218

问:

我知道有很多与我类似的问题,但是在过去的 30 分钟内,我浏览了数十个线程,无法找到问题的答案。

我有一个包含百分百列和行的数据帧,并使用函数中的大多数列来返回应该添加到其他列的值。

该问题可以分解为以下几点。

lookup = {"foo": 1, "bar": 0}

def lookuptable(input_string, input_factor):
    return lookup[input_string] * input_factor

mydata = pd.DataFrame([["foo", 4], ["bar",3]], columns = ["string","faktor"])
mydata["looked up value"] = lookuptable(mydata["string"], mydata["faktor"])

但这又回来了:

TypeError: 'Series' objects are mutable, thus they cannot be hashed

有没有办法在不重组函数本身的情况下避免这个问题?

提前致谢!

熊猫 字典 可变

评论


答:

1赞 Andreas 4/29/2021 #1

函数接受 2 个参数:一个字符串和一个整数。 但是您为函数提供了 2 个 pandas 系列。但是,您可以循环访问数据帧,并使用 为函数提供参数(按行)。.apply()

mydata["looked up value"] = mydata\
.apply(lambda row: lookuptable(row["string"], row["faktor"]), axis=1)

评论

1赞 Tom S 4/29/2021
这似乎有效,但我没有很多其他错误,所以一旦我的代码没有错误,我就会接受你的答案。
2赞 Hamza usman ghani 4/29/2021 #2

试试这个:

lookup = {"foo": 1, "bar": 0}

def lookuptable(data):
    return lookup[data["string"]] * data["faktor"]

mydata = pd.DataFrame([["foo", 4], ["bar",3]], columns = ["string","faktor"])
mydata["looked up value"] = mydata.apply(lookuptable, axis=1)

print(mydata)

    string  faktor  looked up value
0   foo        4        4
1   bar        3        0

评论

0赞 Tom S 4/29/2021
谢谢。这似乎与安德烈亚斯的提议非常相似。
2赞 Gusti Adli 4/29/2021 #3

除了使用 ,您还可以将列表推导与.apply().iterrows()

mydata["looked up value"] = [lookuptable(row[1]["string"], row[1]["faktor"]) for row in mydata.iterrows()]
1赞 Nk03 4/29/2021 #4

您可以在没有功能的情况下执行此操作 -

import pandas as pd
lookup = {"foo": 1, "bar": 0}
mydata = pd.DataFrame([["foo", 4], ["bar",3]], columns = ["string","factor"])
mydata["looked up value"] = mydata['string'].map(lookup) * mydata['factor']

评论

0赞 Tom S 4/29/2021
我知道。但如上所述。原始函数包含 100 多个值,并在整个程序中的许多不同位置使用
0赞 Nk03 4/29/2021
因此,将函数调用替换为无处不在的赋值。我不确定,但这可能比申请更快。