对Series执行reset_index(inplace=True)无法生成DataFrame,索引重置失败如何解决?
报错成因
你执行df_tf = new[new['a']=='sarim']['Amount1']后得到的df_tf是Series类型,而非DataFrame:
pandas中reset_index对Series和DataFrame的支持逻辑不同:
- 对DataFrame调用
reset_index(inplace=True)是合法操作,仅原地修改索引即可,不需要变更对象类型 - 对Series调用
reset_index默认会生成包含「原索引列+原Series值列」的全新DataFrame,涉及对象类型的变更,不可能通过原地修改(inplace)原有Series的内存结构实现,因此pandas直接禁止该操作,抛出对应错误。
正确实现方案
下面是3种可直接使用的实现方式:
- 方案1:取数阶段直接保留DataFrame结构
取列时用双层方括号包裹列名,得到的就是单列DataFrame,后续可直接用inplace重置索引:
# 双层方括号取列,得到DataFrame而非Series df_tf = new.loc[new['a'] == 'sarim', ['Amount1']] # drop=True表示丢弃原来的旧索引,不需要保留为新列 df_tf.reset_index(drop=True, inplace=True) ret_df['Amount1'] = df_tf['Amount1']
- 方案2:针对已得到的Series,不使用inplace参数,直接接收reset_index的返回值
reset_index默认会把Series转换为DataFrame,直接赋值给变量即可:
df_tf = new[new['a'] == 'sarim']['Amount1'] # 不使用inplace,直接接收返回的DataFrame df_tf = df_tf.reset_index(drop=True) ret_df['Amount1'] = df_tf
- 方案3:先将Series转为DataFrame,再执行原地重置索引
df_tf = new[new['a'] == 'sarim']['Amount1'] # 先转成DataFrame df_tf = df_tf.to_frame(name='Amount1') df_tf.reset_index(drop=True, inplace=True) ret_df['Amount1'] = df_tf['Amount1']
内容的提问来源于stack exchange,提问作者SARIM
相关产品推荐
相关产品推荐

