Pandas sort_values无法识别state列、排序无效的技术求助
Pandas排序触发'state'列KeyError的解决方案
你遇到的报错和列重命名的写法完全无关,问题根源出在对state字段的属性处理上,具体拆解如下:
- 根本报错原因:你在合并前就把
state列设置成了DataFrame索引
合并前你依次执行了df_2017=df_2017.set_index('state')这类操作,此时state已经从可被sort_values识别的普通数据列,变成了行索引属性。后续合并时,pandas会自动按索引对齐,合并完成后的结果里,state依然是索引属性,不属于普通列,调用sort_values(by=['state'])时自然会抛出KeyError。 - 排序不生效的额外原因:排序操作没有接住返回值
哪怕你解决了索引问题,sort_values默认是返回排序后的新DataFrame,不会原地修改原对象,你之前直接写排序语句但没有把结果赋值给变量,就算不报错,原DataFrame的行顺序也不会有任何变化。 - 关于你疑惑的重命名方式:你直接给
df.columns赋值重命名的写法完全合规
只要你赋值的列名长度和原DataFrame的列数匹配,这种写法和官方提供的rename函数效果没有本质区别,这步根本不是报错的来源。
可直接落地的修改方案
两种写法都可以实现按州名字母排序的效果,按需选择即可:
- 保留state为普通列的写法(更直观,适合新手)
合并前不要提前把state设为索引,等排序完成后再根据需要设置索引:# 删掉合并前的set_index('state')操作 merged_US_states_visitation = ( df_2017.merge(df_2018, on='state', how='left') .merge(df_2019, on='state', how='right') ) # 排序并接住返回值 merged_US_states_visitation = merged_US_states_visitation.sort_values(by='state') # 如果需要把state设为索引,在排序完成后再操作 merged_US_states_visitation = merged_US_states_visitation.set_index('state') - 保留提前设索引的写法(更高效)
如果不想反复调整列的属性,可以保留提前设置索引的操作,合并和排序时针对索引操作即可:# 保留提前set_index('state')的操作 merged_US_states_visitation = ( df_2017.merge(df_2018, left_index=True, right_index=True, how='left') .merge(df_2019, left_index=True, right_index=True, how='right') ) # 因为state是行索引,直接用sort_index完成字母排序 merged_US_states_visitation = merged_US_states_visitation.sort_index()
内容的提问来源于stack exchange,提问作者user12755836
相关产品推荐
相关产品推荐

