提问人:Tom S 提问时间:4/29/2021 更新时间:4/29/2021 访问量:218
使用包括 dict 查找在内的函数计算的 pandas 列,“Series”对象是可变的,因此无法对其进行哈希处理
pandas column calculated using function including dict lookup, 'Series' objects are mutable, thus they cannot be hashed
问:
我知道有很多与我类似的问题,但是在过去的 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
因此,将函数调用替换为无处不在的赋值。我不确定,但这可能比申请更快。
评论