Skip to main content
 首页 » 编程设计

python之Pandas 数据框中的 FutureWarning

2025年05月04日17mq0036

我有一个示例 python 代码:

import pandas as pd 
ddf = pd.DataFrame({'col1' : ['A', 'A', 'B'], 
                'Id' : [3,1,2], 
                'col3': ['x','a','b']}) 
ddf.index=ddf['Id'] 
ddf.sort_values(by='Id') 

上面的代码片段产生了“FutureWarning: 'Id' is both an index level and a column label.”默认为列,但这会在未来的版本中引发歧义错误。当我在最新版本的 python 下尝试这个时,它确实变成了一个错误。我对 python 和 Pandas 很陌生。我该如何解决这个问题?

请您参考如下方法:

这里最好的方法是使用 DataFrame.set_index 将列 Id 转换为 index为了避免 index.name 与列名之一相同:

ddf = pd.DataFrame({'col1' : ['A', 'A', 'B'], 
                'Id' : [3,1,2], 
                'col3': ['x','a','b']}) 
ddf = ddf.set_index('Id') 
 
print (ddf.index.name) 
Id 
print (ddf.columns) 
Index(['col1', 'col3'], dtype='object') 

更适合按索引排序的是 DataFrame.sort_index :

print (ddf.sort_index()) 
   col1 col3 
Id           
1     A    a 
2     B    b 
3     A    x 

您的解决方案有效,如果更改 index.name 不同:

ddf = pd.DataFrame({'col1' : ['A', 'A', 'B'], 
                'Id' : [3,1,2], 
                'col3': ['x','a','b']}) 
ddf.index=ddf['Id'] 

print (ddf.index.name) 
Id 
print (ddf.columns) 
Index(['col1', 'Id', 'col3'], dtype='object') 

通过DataFrame.rename_axis设置不同的index.name或由标量设置:

ddf = ddf.rename_axis('newID') 
#alternative 
#ddf.index.name = 'newID'  
 
print (ddf.index.name) 
newID 
print (ddf.columns) 
Index(['col1', 'Id', 'col3'], dtype='object') 

所以现在可以区分索引级别和列名称,因为 sort_values 与两者一起工作:

print(ddf.sort_values(by='Id')) 
      col1  Id col3 
newID               
1        A   1    a 
2        B   2    b 
3        A   3    x 
 
print (ddf.sort_values(by='newID')) 
#same like sorting by index 
#print (ddf.sort_index()) 
      col1  Id col3 
newID               
1        A   1    a 
2        B   2    b 
3        A   3    x