Python使用np.unique提取pandas列唯一值报错如何解决
错误原因
- 第一种写法
Year = np.unique(Trees['Year'])返回值为numpy数组,哪怕仅包含1个年份元素也是数组格式,直接用Year == 2014会返回布尔数组,Python无法直接对数组做真值判断,因此触发歧义报错。 - 第三种写法
Year = np.unique(Trees[Trees.Year])逻辑完全错误:该写法是把Year列的数值当作行筛选的布尔条件,最终会返回空数组,所以判断时直接进入未知年份分支。 - 第二种写法
Year = Trees['Year'].iloc[0]逻辑可行,但如果第一行的Year列为空值会得到错误结果,不如取唯一值的方案稳妥。
正确提取年份的方案
你明确每个待处理DataFrame的Year列取值完全一致,直接取唯一值后转成标量即可,推荐两种写法:
方案1:极简写法
直接用pandas内置的unique方法取唯一值,提取第一个元素即可:
Year = Trees['Year'].unique()[0]
方案2:加校验的稳健写法
可以先校验Year列的唯一值数量,避免脏数据导致后续逻辑出错:
year_unique_list = Trees['Year'].unique() # 校验唯一值数量是否为1 if len(year_unique_list) != 1: print("当前DataFrame的Year列存在多个不同取值,请检查数据") quit() Year = year_unique_list[0]
可选优化
可以把提取到的Year显式转为整数,避免类型不一致导致判断失效,同时可以合并重复的loc操作简化代码:
Year = int(Trees['Year'].unique()[0]) if Year == 2014: # 合并相同筛选条件的赋值操作,同时修改两列 Trees.loc[(Trees['FieldSP'] == 'RW') & (Trees['DBH'] <= 39.37), ['FieldSP', 'FIA_code']] = ['Rwa', '211a'] Trees.loc[(Trees['FieldSP'] == 'RW') & (Trees['DBH'] > 39.37), ['FieldSP', 'FIA_code']] = ['Rwb', '211b'] elif Year == 2011: print('COP 2011 has not been added yet!') quit() else: print('the COP year in the treelist is not one we know about. fix it') quit()
内容的提问来源于stack exchange,提问作者Gloria Desanker
相关产品推荐
相关产品推荐

