2

我有一个示例 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 很陌生。我该如何解决这个问题?

4

3 回答 3

4

这里最好将列转换IdindexwithDataFrame.set_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')

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

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
于 2019-08-19T14:00:45.513 回答
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
于 2019-08-19T14:01:32.150 回答
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
于 2019-08-19T14:05:52.463 回答