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

103

Je rencontre un problème ici, dans mon package python, j'ai installé numpy, mais j'ai toujours cette erreur 'DataFrame' object has no attribute 'sort'

Tout le monde peut me donner une idée.

Voici 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)
Shi Jie Tio
la source

Réponses:

223

sort() était obsolète pour DataFrames au profit de l'une ou l'autre:

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 (05/05/2017).

Brad Solomon
la source
15

Tri des pandas 101

sorta été remplacé dans la v0.20 par DataFrame.sort_valueset DataFrame.sort_index. En dehors de cela, nous avons également argsort.

Voici quelques cas d'utilisation courants du 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 unique

Par exemple, pour trier dfpar colonne "A", utilisez sort_valuesavec un seul nom de colonne:

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 nouvel RangeIndex, utilisez DataFrame.reset_index.

Trier par plusieurs colonnes

Par exemple, pour trier par les deux colonnes "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 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 fait un simple problème d'indexation. Passer simplement des étiquettes entières à ilocfera l'affaire.

df.iloc[idx]

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