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

94 篇文章 4 订阅
21 篇文章 1 订阅

这个错误是数值大小错误

具体的意思是: 必须有相同长度的关键字跟值,当设置的对象是一个可迭代的对象的时候。

  • 可迭代的对象,就是想tuple,list,字典一类的。

遇到这个错误,我故意在做测试的时候。

具体的代码

这段代码是有错误的,错误部分已经标记出来了

import pandas as pd

if __name__ == '__main__':
    df = pd.DataFrame({'AAA': range(5), 'BBB': list('abcde'), 'CCC': ['a', 12, 1.2, ['alist'], (1, 2)]})
    print(df)
    df.loc[df.AAA >= 2, 'BBB'] = '-Changed'
    print(df)
    df.loc[df.AAA >= 3, 'CCC'] = [1, 3, 3] # 错了
    print(df)

知道问题在哪之后,这个该怎么解决呢?

我们先把这个语句,还有这个dataframe单独拿出来看

df.loc[df.AAA >= 3, ‘CCC’] = [1, 3, 3]

  • dataframe在此!
   AAA BBB      CCC
0    0   a        a
1    1   b       12
2    2   c      1.2
3    3   d  [alist]
4    4   e   (1, 2)

接下来,我将前面那些没有问题代码去掉。只用那个生成的来做探索
这里,分别对于这个函数的理解,或者说是用途,做出两种不同解法。
第一种:将这个长度改为相等的。
将这个语句做下面的修改。

df.loc[df.AAA >= 3, ‘CCC’] = [1, 3]

源码被我改成这样,输出的结果就会发生改变

import pandas as pd

if __name__ == '__main__':
    df = pd.DataFrame({'AAA': range(5), 'BBB': list('abcde'), 'CCC': ['a', 12, 1.2, ['alist'], (1, 2)]})
    print(df)
    df.loc[df.AAA >= 3, 'CCC'] = [1, 3]
    print(df)
   AAA BBB      CCC
0    0   a        a
1    1   b       12
2    2   c      1.2
3    3   d  [alist]
4    4   e   (1, 2)
   AAA BBB  CCC
0    0   a    a
1    1   b   12
2    2   c  1.2
3    3   d    1
4    4   e    3

注意到了没有,在后面的部分,CCC被按照迭代的方式,顺序的放到了对应的位置当中。


第二种方法: 如果我想要让每个地方都变成对应的的list怎么弄呢?
可以将代码改成下面这样子!这样就可以避免到了不断地取找迭代的对象接着去迭代,使得会报错!
import pandas as pd

if __name__ == '__main__':
    df = pd.DataFrame({'AAA': range(5), 'BBB': list('abcde'), 'CCC': ['a', 12, 1.2, ['alist'], (1, 2)]})
    print(df)
    df.loc[df.AAA >= 3, 'CCC'] = [frozenset((1, 2)), frozenset((1, 3))]
    print(df)

这时候的输出的结果是:

   AAA BBB      CCC
0    0   a        a
1    1   b       12
2    2   c      1.2
3    3   d  [alist]
4    4   e   (1, 2)
   AAA BBB     CCC
0    0   a       a
1    1   b      12
2    2   c     1.2
3    3   d  (1, 2)
4    4   e  (1, 3)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥宅_Sean

公众号“肥宅Sean”欢迎关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值