pandas1.0.5使用.loc按条件给多列赋值报KeyError如何解决
错误原因
- 第一个
KeyError:你使用的pandas 1.0.5版本中,loc不支持同时做行过滤、给不存在的多列直接赋值,col_1和col_2还没有被创建,所以定位列的时候抛出找不到列的错误。 - 第二个
TypeError:去掉loc之后的df[布尔序列, 列名列表]写法本身不合法,df[]默认只能接受单维度的索引参数,你传入的元组会被尝试作为哈希键查找,而布尔Series是可变对象无法被哈希,因此报错。
解决方案
方法1:兼容你原有逻辑的写法
先提前创建两个空列,再用loc按条件赋值:
import pandas as pd import numpy as np test = {'Price': ['Free','free', '-16.66', 'Name', '']} df = pd.DataFrame(test) # 先创建新列,初始值设为NaN df[['col_1', 'col_2']] = np.nan # 再按条件赋值 mask = df['Price'].astype(str).str.contains(':') df.loc[mask, ['col_1', 'col_2']] = df['Price'].astype(str).str.split(':', n=1, expand=True)
方法2:更简洁的写法,无需提前过滤
str.split加expand=True会自动把不包含冒号的行的第二列填充为NaN,完全符合你的需求,不需要额外加loc过滤:
import pandas as pd test = {'Price': ['Free','free', '-16.66', 'Name', '']} df = pd.DataFrame(test) df[['col_1', 'col_2']] = df['Price'].astype(str).str.split(':', n=1, expand=True)
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

