大熊猫数据框架中的FutureWarning

时间:2019-08-19 13:56:52

标签: python pandas

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

3 个答案:

答案 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