python报错:ValueError: Must have equal len keys and value when setting with an iterable// .loc() .at()

在处理数据时,想要修改某个数据,一开始直接使用数据切片进行赋值

df['math'][0] = 100

 虽然数据修改成功了,但是这种情况代码运行时会有警告:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: Indexing and selecting data — pandas 1.4.2 documentation

为了解决这个警告问题,查阅了相关资料:在python中默认的切片数据类型是“只读不能写”的,可以使用loc函数定位到的是原dataframe中的列,可修改

因此尝试loc函数

df.loc[1,'math'] = 110

 数据修改成功 且没有再报warning

完美

你以为到这就结束了嘛 天真  我后面在对数据赋值列表时,居然报报报报报报错了:

ValueError: Must have equal len keys and value when setting with an iterable

.loc 不能直接存入列表,可做如下尝试:

1.将添加的列表转化为byte数据

2.写入

3.转换回来

df.loc[0,'all'] = np.array([89,100]).tobytes()
np.frombuffer(df.loc[0,'all'], dtype=int)

 但这样存在一个问题,如图,虽然最后提取结果的时候能数据转化后提取出来  但是我的原表数据还是byte类型 ,这不是我想要的 ,我想要在原表上直接就得到我想要的列表。

后来我就想,数据切片会警告,loc会报错,那么at可不可以呢,尝试一下

在使用at之前,需要先转换一下该列的数据类型,转为object

df['all'] = df['all'].astype('object')
df.at[0,'all'] = [89,100]

 成功了。。。没有警告没有报错

暂时没查到原始,但是目前证明是可行的,后续找到原因继续补充,希望不会有问题

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值