本文主要是介绍Pandas 报错 TypeError: ‘Series‘ objects are mutable, thus they cannot be hashed,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、需求
根据原始 CSV 文件的列 A 的值,添加一列 B。
二、尝试 1
1. 将 A 列与 B 列对应的值写入字典 dict,A 列为 key,B 列为 value。
2. 将 CSV 文件处理为 DataFrame。
3.
import pandas as pd# 如果 df['A']存在于 dict_a 中,则取 value,值,否则使用默认值 15
dict_a = {'a':1,'b':1,'c':2,'d':4,'d':3}df = pd.read_csv(example.csv)
df['B'] = dict_a[df['A']]
# 上句话报错: TypeError: 'Series' objects are mutable, thus they cannot be hashed
在用pandas 处理文件时 报错:TypeError: 'Series' objects are mutable, thus they cannot be hashed,意思是 df['B'] 整体上是一个 Series,是容易改变的,因此不能作为 index 进行检索并赋值。
三、尝试 2
使用 for 循环,遍历 DataFrame的每一行,代码如下:
data = pd.read_csv('example.csv')
df = pd.DataFrame(data)
df['B'] = 15 # 设置默认值为 15# iterrows 遍历 DataFrame 的每一行
for index, row in df.iterrows():if row['A'] in dict_a: print(row['B']) row['B'] = dict_a[row['A']] print(row['B']) else:row['B'] = 15df.to_csv('finished.csv')
通过 print 出来的结果可以看出来确实赋值成功,但生成的文件却没变化。
原因是:iterrows不要修改行,不应该修改正在迭代的东西。这不能保证在所有情况下都能正常工作。根据数据类型的不同,迭代器返回一个副本而不是一个视图,因此写入它将不起作用。
四、解决办法
最终使用 lambda 函数 及 df.apply()函数
遍历行并访问函数的多个列。
代码如下:
# 注意 函数 formula() 一定要有返回值,否则下面 apply 函数不起作用
def formula(x):if x in slidetime_dict:return slidetime_dict[x]else:return 15df['slidetime'] = df.apply(lambda row: formula(row['A']), axis=1)
以上,问题解决。
————————————————————————————————————————————————————
更新补充知识点:
pandas 使用 apply() 函数时,被调用的函数(本例中是 formula())中各种条件分支都要有 return 返回值,否则生成的结果不对。
这篇关于Pandas 报错 TypeError: ‘Series‘ objects are mutable, thus they cannot be hashed的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!