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 返回值,否则生成的结果不对。

 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值