报错处理一:ValueError: Must have equal len keys and value when setting with an iterable
这个错误是数值大小错误
具体的意思是: 当设置的对象是一个可迭代的对象的时候, 必须有相同长度的关键字跟值。
- 可迭代的对象,就是例如 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)
下次遇到别的错误就再记录
嘻嘻
搬个板凳,坐等
看来还有续集啊