向Pandas DataFrame添加两列时遇问题:某列被设为索引
解决方法:用指定列字典和索引构造新DataFrame
我懂你遇到的麻烦了——你想把两个列表作为新DataFrame的普通列,同时复用已有Filter3的索引,但结果不小心把其中一列当成索引了对吧?问题大概率出在你构造DataFrame的方式上,下面给你两种靠谱的解决方案:
方案1:基于已有的列表构造
如果你已经把STNAME和CTYNAME转成了列表,直接用字典来定义列,同时显式指定索引参数就可以避免列被设为索引:
import pandas as pd # 你的现有变量:STNAME、CTYNAME、ORIG_INDEX new_df = pd.DataFrame( data={ 'STNAME': STNAME, 'CTYNAME': CTYNAME }, index=ORIG_INDEX )
这样构造出来的new_df会有两个普通列STNAME和CTYNAME,索引完全复用Filter3的索引,不会出现列被误设为索引的情况。
方案2:直接从原DataFrame提取列(更高效)
其实你根本不需要先把列转成列表,直接从Filter3中提取需要的列来构造新DataFrame更简洁高效:
new_df = Filter3[['STNAME', 'CTYNAME']].copy()
或者如果你需要完全独立的新DataFrame(不与原DataFrame共享数据),也可以显式指定索引:
new_df = pd.DataFrame( { 'STNAME': Filter3['STNAME'], 'CTYNAME': Filter3['CTYNAME'] }, index=Filter3.index )
为什么之前会出错?
你之前的操作可能是在构造DataFrame时没有用字典定义列,比如误写成了:
# 错误示例!这样会把CTYNAME当成列名列表,STNAME作为数据 new_df = pd.DataFrame(STNAME, CTYNAME, index=ORIG_INDEX)
这种写法会把第二个参数CTYNAME解析为列名,而STNAME作为数据行,最终导致完全不符合预期的结构,甚至可能出现某列被误设为索引的情况。
内容的提问来源于stack exchange,提问作者ZakS
相关产品推荐
相关产品推荐

