我有一个示例 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
