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'] = 15 df.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 15 df['slidetime'] = df.apply(lambda row: formula(row['A']), axis=1)
以上,问题解决。
————————————————————————————————————————————————————
更新补充知识点:
pandas 使用 apply() 函数时,被调用的函数(本例中是 formula())中各种条件分支都要有 return 返回值,否则生成的结果不对。