Pandas dataframe.set_index() 删除以前的索引和列

问题描述 投票:0回答:4

我刚刚在 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)

感谢您的建议

python pandas dataframe indexing
4个回答
7
投票

您可以执行以下操作

>>> df_mn.reset_index().set_index('year')
      month  sale
year             
2012      1    55
2014      4    40
2013      7    84
2014     10    31

0
投票

我发现重新保留以前的列的解决方案是设置 drop=False dataframe.set_index('some_column',drop=False).这不是完美的答案,但它有效!


0
投票

不,在这种情况下,您必须保存上一列,如图所示 如下:

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()。


0
投票

当前的两个最佳答案都解决了部分问题。

完整的解决方案是:

df_mn.reset_index().set_index('year', drop=False)

首先调用

.reset_index()
会将初始索引转换为列,因此在调用
set_index()
时不会丢失它。

drop=False
添加到
set_index
调用意味着当设置为索引时
year
不会被删除。

© www.soinside.com 2019 - 2024. All rights reserved.