我有一个示例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'既是索引级别又是列标签。默认为列,但这会在将来的版本中引起歧义错误。当我在最新版本的python中尝试此操作时,它的确变成了错误。我对python和pandas很陌生。我该如何解决这个问题?
答案 0 :(得分:3)
最好将Id
的列与DataFrame.set_index
转换为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
答案 1 :(得分:2)
简单添加.values
ddf.index=ddf['Id'].values
ddf.sort_values(by='Id')
Out[314]:
col1 Id col3
1 A 1 a
2 B 2 b
3 A 3 x
答案 2 :(得分:1)
您的列和行索引都包含“ Id”,一个简单的解决方案是不将(行)索引设置为“ Id”。
import pandas as pd
ddf = pd.DataFrame({'col1' : ['A', 'A', 'B'],
'Id' : [3,1,2],
'col3': ['x','a','b']})
ddf.sort_values(by='Id')
Out[0]:
col1 Id col3
1 A 1 a
2 B 2 b
0 A 3 x
或在创建df时设置索引:
ddf = pd.DataFrame({'col1' : ['A', 'A', 'B'],
'col3': ['x','a','b']},
index=[3,1,2])
ddf.sort_index()
Out[1]:
col1 col3
1 A a
2 B b
3 A x