web-dev-qa-db-fra.com

L'objet 'DataFrame' n'a pas d'attribut 'sort'

Je rencontre un problème ici, dans mon paquetage python, j'ai installé numpy, mais j'ai toujours cette erreur l'objet 'DataFrame' n'a pas d'attribut 'sort'

Tout le monde peut me donner une idée ..

Ceci est mon code:

final.loc[-1] =['', 'P','Actual']
final.index = final.index + 1  # shifting index
final = final.sort()
final.columns=[final.columns,final.iloc[0]]
final = final.iloc[1:].reset_index(drop=True)
final.columns.names = (None, None)
76
Shi Jie Tio

sort() est devenu obsolète pour DataFrames en faveur de:

sort() était obsolète (mais toujours disponible) dans Pandas avec la version 0.17 (2015-10-09) avec l'introduction de sort_values() et sort_index(). Il a été supprimé de Pandas avec la version 0.20 (2017-05-05).

183
Brad Solomon

Pandas Triés 101

sort a été remplacé dans la v0.20 par DataFrame.sort_values et DataFrame.sort_index . En plus de cela, nous avons aussi argsort.

Voici quelques cas d'utilisation courants en matière de tri et comment les résoudre à l'aide des fonctions de tri de l'API actuelle. Tout d'abord, la configuration.

_# Setup
np.random.seed(0)
df = pd.DataFrame({'A': list('accab'), 'B': np.random.choice(10, 5)})    
df                                                                                                                                        
   A  B
0  a  7
1  c  9
2  c  3
3  a  5
4  b  2
_

Trier par colonne simple

Par exemple, pour trier df par la colonne "A", utilisez _sort_values_ avec un nom de colonne unique:

_df.sort_values(by='A')

   A  B
0  a  7
3  a  5
4  b  2
1  c  9
2  c  3
_

Si vous avez besoin d’un nouveau RangeIndex, utilisez DataFrame.reset_index .

Trier par plusieurs colonnes

Par exemple, pour trier par à la fois col "A" et "B" dans df, vous pouvez passer une liste à _sort_values_:

_df.sort_values(by=['A', 'B'])

   A  B
3  a  5
0  a  7
4  b  2
2  c  3
1  c  9
_

Trier par Index de DataFrame

_df2 = df.sample(frac=1)
df2

   A  B
1  c  9
0  a  7
2  c  3
3  a  5
4  b  2
_

Vous pouvez le faire en utilisant _sort_index_:

_df2.sort_index()

   A  B
0  a  7
1  c  9
2  c  3
3  a  5
4  b  2

df.equals(df2)                                                                                                                            
# False
df.equals(df2.sort_index())                                                                                                               
# True
_

Voici quelques méthodes comparables avec leurs performances:

_%timeit df2.sort_index()                                                                                                                  
%timeit df2.iloc[df2.index.argsort()]                                                                                                     
%timeit df2.reindex(np.sort(df2.index))                                                                                                   

605 µs ± 13.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
610 µs ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
581 µs ± 7.63 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
_

Trier par liste d'indices

Par exemple,

_idx = df2.index.argsort()
idx
# array([0, 7, 2, 3, 9, 4, 5, 6, 8, 1])
_

Ce problème de "tri" est en réalité un simple problème d'indexation. Il suffit de passer des étiquettes entières à iloc.

_df.iloc[idx]

   A  B
1  c  9
0  a  7
2  c  3
3  a  5
4  b  2
_
5
cs95