Ordinare una panda di Serie con l’indice

Ho una Panda dataframe chiamato pd, e ho estratto il numero di valori univoci in una delle colonne di questo dataframe utilizzando il seguente comando:

b = df.groupby('Region').size()

b è un Panda serie di oggetti e simile a questa:

In [48]: b
Out[48]: 
Region
0          8
1         25
11         1
2         41
3         23
4         15
5         35
6         24
7         27
8         50
9         55
N         10

Sto cercando di tracciare un grafico a barre della serie, tuttavia, vorrei ordinare il primo basato sulla prima colonna (a causa di che 11 tra 1 e 2), che sarà l’asse x etichette. Ho provato a passare il comando di ordinamento, ma è sorta la serie basata sui valori della seconda colonna:

b.sort()

In [48]: b
Out[54]: 
Region
11         1
0          8
N         10
4         15
3         23
6         24
1         25
7         27
5         35
2         41
8         50
9         55

Beh, c’è un modo per risolvere questa serie si basa sulla prima colonna?

Questa domanda è per quanto riguarda l’ordinamento di una panda di Serie con la sua indice. Se volete sapere come ordinare una Serie di valori, vedere questo post.

OriginaleL’autore marillion | 2013-10-02

3 Replies
  1. 2

    È necessario per convertire il vostro indice di un indice di oggetto, perché è attualmente l’ordinamento lexicographically, non numericamente:

    In [97]: s = read_clipboard(header=None)
    
    In [98]: news = s.rename(columns=lambda x: ['Region', 'data'][x])
    
    In [99]: news
    Out[99]:
       Region  data
    0       0     8
    1       1    25
    2      11     1
    3       2    41
    4       3    23
    5       4    15
    6       5    35
    7       6    24
    8       7    27
    9       8    50
    10      9    55
    11      N    10
    
    In [100]: news_converted = news.convert_objects(convert_numeric=True)
    
    In [101]: news_converted
    Out[101]:
        Region  data
    0        0     8
    1        1    25
    2       11     1
    3        2    41
    4        3    23
    5        4    15
    6        5    35
    7        6    24
    8        7    27
    9        8    50
    10       9    55
    11     NaN    10
    
    In [102]: news_converted.loc[11, 'Region'] = 'N'
    
    In [103]: news_converted_with_index = news_converted.set_index('Region')
    
    In [104]: news_converted_with_index
    Out[104]:
            data
    Region
    0.0        8
    1.0       25
    11.0       1
    2.0       41
    3.0       23
    4.0       15
    5.0       35
    6.0       24
    7.0       27
    8.0       50
    9.0       55
    N         10
    
    In [105]: news_converted_with_index.sort_index()
    Out[105]:
            data
    Region
    0.0        8
    1.0       25
    2.0       41
    3.0       23
    4.0       15
    5.0       35
    6.0       24
    7.0       27
    8.0       50
    9.0       55
    11.0       1
    N         10

    È probabilmente un modo migliore per creare il tuo Series in modo che non mescolare tipi di indice.

    Cloud grazie! questo sembra risolvere il problema della raccolta differenziata, ora sto cercando in costruzione di questa serie in un modo migliore come hai detto. Tutto è iniziato con il tentativo di contare i singoli valori di df colonna, che ha ‘N’, come uno dei valori di dati.
    Ci si va 🙂
    Grazie.

    OriginaleL’autore Phillip Cloud

  2. 13

    Stai cercando sort_index:

    In [80]: b.sort_values()
    Out[80]: 
    6     1
    11    2
    9     2
    1     4
    10    4
    2     5
    3     6
    4     7
    8     8
    5     9
    dtype: int64
    
    In [81]: b.sort_index()
    Out[81]: 
    1     4
    2     5
    3     6
    4     7
    5     9
    6     1
    8     8
    9     2
    10    4
    11    2
    dtype: int64
    sort_index() mi dà ancora lo stesso output con Out[48] di sopra, 11 è ancora tra 1 e 2. È come il panda è il trattamento i valori di indice come testo. Ho N come uno dei valori di indice di se.

    OriginaleL’autore bdiamante

  3. 8

    C’è solo 1 ‘colonna’ di valori. Il primo ‘colonna’ è l’indice.
    Docs sono qui

    In [8]: s = Series([3,2,1],index=[1,3,2])
    
    In [9]: s
    Out[9]: 
    1    3
    3    2
    2    1
    dtype: int64

    Sorta di indice

    In [10]: s.sort_index()
    Out[10]: 
    1    3
    2    1
    3    2
    dtype: int64

    Ordina per valori

    In [11]: s.sort_values()
    Out[11]: 
    2    1
    3    2
    1    3
    dtype: int64
    Ho lasciato questo commento per bdiamente risposta, ma qui si va oltre: sort_index() mi dà ancora lo stesso output con Out[48] di sopra, 11 è ancora tra 1 e 2. È come il panda è il trattamento i valori di indice come testo. Ho N come uno dei valori di indice di se.
    essi POTREBBERO essere di testo, come hai fatto a crearlo?
    Sono i vostri valori di testo. Avrete bisogno di convertire i numeri per i tipi numerici e utilizzare un oggetto dtype Indice. Quindi sort_index() fare quello che vuoi, anche se non c’è probabilmente un modo migliore per fare questo senza aver mescolato numerico/string indici.
    la df è stato costruito utilizzando il pd.read_csv(‘filename.csv’), poi ho usato groupby per contare il numero di valori univoci. Forse la ‘N’ valore dei dati ha portato a un indice con il tipo di testo.
    ahh…non vedi la N, sì certo, automaticamente il testo in quel modo. Meglio mettere sottili in un DataFrame, sostituire il valore con un numero e sarete a posto.

    OriginaleL’autore Jeff

Lascia un commento