我刚刚在 Pandas DataFrames 中遇到了一个奇怪的现象,当使用 DataFrame.set_index('some_index') 设置索引时,同时也是索引的旧列被删除了!这是一个例子:
import pandas as pd
df = pd.DataFrame({'month': [1, 4, 7, 10],'year': [2012, 2014, 2013, 2014],'sale':[55, 40, 84, 31]})
df_mn=df.set_index('month')
>>> df_mn
sale year
month
1 55 2012
4 40 2014
7 84 2013
10 31 2014
现在我将索引更改为年份:
df_mn.set_index('year')
sale
year
2012 55
2014 40
2013 84
2014 31
.. 月份列与索引一起被删除。这很令人恼火,因为我只想交换 DataFrame 索引。
有没有办法不删除作为索引的前一列?也许通过类似的方法: DataFrame.set_index('new_index',delete_previous_index=False)
感谢您的建议
您可以执行以下操作
>>> df_mn.reset_index().set_index('year')
month sale
year
2012 1 55
2014 4 40
2013 7 84
2014 10 31
我发现重新保留以前的列的解决方案是设置 drop=False dataframe.set_index('some_column',drop=False).这不是完美的答案,但它有效!
不,在这种情况下,您必须保存上一列,如图所示 如下:
import pandas as pd
df = pd.DataFrame({'month': [1, 4, 7, 10],'year': [2012, 2014, 2013, 2014],'sale':[55, 40, 84, 31]})
df_mn=df.set_index('month')
df_mn['month'] = df_mn.index #Save it as another column, and then run set_index with year column as value.
df_mn.set_index('year')
除了您使用重复的数据帧 df_mn ,因此数据帧 df 保持不变,您可以再次使用它。 另外,如果您没有设置
set_index 的inplace参数为True
df_mn 即使在调用 set_index() 之后也不会改变。
另外,像其他答案一样,您可以随时使用reset_index()。
当前的两个最佳答案都解决了部分问题。
完整的解决方案是:
df_mn.reset_index().set_index('year', drop=False)
首先调用
.reset_index()
会将初始索引转换为列,因此在调用set_index()
时不会丢失它。
将
drop=False
添加到 set_index
调用意味着当设置为索引时 year
不会被删除。