Come ruotare un dataframe


358
  • Cos'è Pivot?
  • Come faccio a ruotare?
  • È un perno?
  • Da lungo formato a grande formato?

Ho visto molte domande che pongono sulle tabelle pivot. Anche se non sanno che stanno chiedendo delle tabelle pivot, di solito lo sono. È praticamente impossibile scrivere una domanda canonica e una risposta che racchiuda tutti gli aspetti del perno ....

... Ma ci proverò.


Il problema con le domande e le risposte esistenti è che spesso la domanda si concentra su una sfumatura che l'OP ha difficoltà a generalizzare al fine di utilizzare un numero di buone risposte esistenti. Tuttavia, nessuna delle risposte tenta di fornire una spiegazione completa (perché è un compito scoraggiante)

Guarda alcuni esempi dalla mia ricerca su Google

  1. Come ruotare un dataframe in Panda?
    • Buona domanda e risposta. Ma la risposta risponde solo alla domanda specifica con poche spiegazioni.
  2. panda tabella pivot al frame di dati
    • In questa domanda, il PO si occupa dell'output del perno. Vale a dire come appaiono le colonne. OP voleva che sembrasse R. Questo non è molto utile per gli utenti di Panda.
  3. Panda che ruotano un frame di dati, righe duplicate
    • Un'altra domanda decente, ma la risposta si concentra su un metodo, vale a dire pd.DataFrame.pivot

Quindi ogni volta che qualcuno cerca pivotottengono risultati sporadici che probabilmente non risponderanno alla loro domanda specifica.


Impostare

Potresti notare che ho chiaramente indicato le mie colonne e i relativi valori di colonna in modo che corrispondano a come farò perno nelle risposte di seguito.

import numpy as np
import pandas as pd
from numpy.core.defchararray import add

np.random.seed([3,1415])
n = 20

cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)

df = pd.DataFrame(
    add(cols, arr1), columns=cols
).join(
    pd.DataFrame(np.random.rand(n, 2).round(2)).add_prefix('val')
)
print(df)

     key   row   item   col  val0  val1
0   key0  row3  item1  col3  0.81  0.04
1   key1  row2  item1  col2  0.44  0.07
2   key1  row0  item1  col0  0.77  0.01
3   key0  row4  item0  col2  0.15  0.59
4   key1  row0  item2  col1  0.81  0.64
5   key1  row2  item2  col4  0.13  0.88
6   key2  row4  item1  col3  0.88  0.39
7   key1  row4  item1  col1  0.10  0.07
8   key1  row0  item2  col4  0.65  0.02
9   key1  row2  item0  col2  0.35  0.61
10  key2  row0  item2  col1  0.40  0.85
11  key2  row4  item1  col2  0.64  0.25
12  key0  row2  item2  col3  0.50  0.44
13  key0  row4  item1  col4  0.24  0.46
14  key1  row3  item2  col3  0.28  0.11
15  key0  row3  item1  col1  0.31  0.23
16  key0  row0  item2  col3  0.86  0.01
17  key0  row4  item0  col3  0.64  0.21
18  key2  row2  item2  col0  0.13  0.45
19  key0  row2  item0  col4  0.37  0.70

Domande)

  1. Perché ottengo ValueError: Index contains duplicate entries, cannot reshape

  2. Come faccio a ruotare in modo dftale che i colvalori siano colonne, i rowvalori siano l'indice e la media dei val0valori?

    col   col0   col1   col2   col3  col4
    row                                  
    row0  0.77  0.605    NaN  0.860  0.65
    row2  0.13    NaN  0.395  0.500  0.25
    row3   NaN  0.310    NaN  0.545   NaN
    row4   NaN  0.100  0.395  0.760  0.24
    
  3. Come faccio a ruotare in modo dftale che i colvalori siano colonne, i rowvalori siano l'indice, la media di val0siano i valori e i valori mancanti siano 0?

    col   col0   col1   col2   col3  col4
    row                                  
    row0  0.77  0.605  0.000  0.860  0.65
    row2  0.13  0.000  0.395  0.500  0.25
    row3  0.00  0.310  0.000  0.545  0.00
    row4  0.00  0.100  0.395  0.760  0.24
    
  4. Posso avere qualcosa di diverso da mean, come forse sum?

    col   col0  col1  col2  col3  col4
    row                               
    row0  0.77  1.21  0.00  0.86  0.65
    row2  0.13  0.00  0.79  0.50  0.50
    row3  0.00  0.31  0.00  1.09  0.00
    row4  0.00  0.10  0.79  1.52  0.24
    
  5. Posso fare più di una aggregazione alla volta?

           sum                          mean                           
    col   col0  col1  col2  col3  col4  col0   col1   col2   col3  col4
    row                                                                
    row0  0.77  1.21  0.00  0.86  0.65  0.77  0.605  0.000  0.860  0.65
    row2  0.13  0.00  0.79  0.50  0.50  0.13  0.000  0.395  0.500  0.25
    row3  0.00  0.31  0.00  1.09  0.00  0.00  0.310  0.000  0.545  0.00
    row4  0.00  0.10  0.79  1.52  0.24  0.00  0.100  0.395  0.760  0.24
    
  6. Posso aggregare su più colonne di valore?

          val0                             val1                          
    col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
    row                                                                  
    row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
    row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
    row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
    row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
    
  7. È possibile suddividere in più colonne?

    item item0             item1                         item2                   
    col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
    row                                                                          
    row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
    row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
    row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
    row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
    
  8. O

    item      item0             item1                         item2                  
    col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
    key  row                                                                         
    key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
         row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
         row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
         row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
    key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
         row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
         row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
         row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
    key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
         row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
         row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
    
  9. Posso aggregare la frequenza con cui la colonna e le righe si verificano insieme, alias "tabulazione incrociata"?

    col   col0  col1  col2  col3  col4
    row                               
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
    
  10. Come posso convertire un DataFrame da lungo a largo ruotando su SOLO due colonne? Dato,

    np.random.seed([3, 1415])
    df2 = pd.DataFrame({'A': list('aaaabbbc'), 'B': np.random.choice(15, 8)})        
    df2        
       A   B
    0  a   0
    1  a  11
    2  a   2
    3  a  11
    4  b  10
    5  b  10
    6  b  14
    7  c   7
    

    Il previsto dovrebbe assomigliare a qualcosa del genere

          a     b    c
    0   0.0  10.0  7.0
    1  11.0  10.0  NaN
    2   2.0  14.0  NaN
    3  11.0   NaN  NaN
    
  11. Come appiattire l'indice multiplo al singolo indice dopo pivot

    A partire dal

       1  2   
       1  1  2        
    a  2  1  1
    b  2  1  0
    c  1  0  0
    

    Per

       1|1  2|1  2|2               
    a    2    1    1
    b    2    1    0
    c    1    0    0
    

Risposte:


301

Iniziamo rispondendo alla prima domanda:

Domanda 1

Perché ottengo ValueError: Index contains duplicate entries, cannot reshape

Ciò si verifica perché Panda sta tentando di reindicizzare uno columnso un indexoggetto con voci duplicate. Esistono vari metodi da utilizzare che possono eseguire un pivot. Alcuni di essi non sono adatti a quando ci sono duplicati delle chiavi in ​​cui viene richiesto di ruotare. Per esempio. Prendere in considerazione pd.DataFrame.pivot. So che ci sono voci duplicate che condividono i valori rowe col:

df.duplicated(['row', 'col']).any()

True

Quindi quando pivotuso

df.pivot(index='row', columns='col', values='val0')

Ottengo l'errore sopra menzionato. In effetti, ottengo lo stesso errore quando provo a eseguire la stessa attività con:

df.set_index(['row', 'col'])['val0'].unstack()

Ecco un elenco di modi di dire che possiamo usare per ruotare

  1. pd.DataFrame.groupby + pd.DataFrame.unstack
    • Un buon approccio generale per fare praticamente qualsiasi tipo di perno
    • Si specificano tutte le colonne che costituiranno i livelli di riga pivot e i livelli di colonna in un gruppo da. Segue selezionando le colonne rimanenti che si desidera aggregare e le funzioni che si desidera eseguire l'aggregazione. Infine, unstacki livelli che si desidera siano nell'indice di colonna.
  2. pd.DataFrame.pivot_table
    • Una versione glorificata groupbycon API più intuitive. Per molte persone, questo è l'approccio preferito. Ed è l'approccio previsto dagli sviluppatori.
    • Specificare il livello di riga, i livelli di colonna, i valori da aggregare e le funzioni per eseguire aggregazioni.
  3. pd.DataFrame.set_index + pd.DataFrame.unstack
    • Conveniente e intuitivo per alcuni (me compreso). Impossibile gestire chiavi raggruppate duplicate.
    • Simile al groupbyparadigma, specifichiamo tutte le colonne che alla fine saranno a livello di riga o colonna e impostiamo quelle come indice. Abbiamo quindi unstacki livelli che vogliamo nelle colonne. Se i restanti livelli di indice o di colonna non sono univoci, questo metodo fallirà.
  4. pd.DataFrame.pivot
    • Molto simile al fatto set_indexche condivide la limitazione della chiave duplicata. Anche l'API è molto limitata. Si richiede solo valori scalari per index, columns, values.
    • Simile al pivot_tablemetodo in cui selezioniamo righe, colonne e valori su cui ruotare. Tuttavia, non possiamo aggregare e se le righe o le colonne non sono univoche, questo metodo fallirà.
  5. pd.crosstab
    • Questa è una versione specializzata di pivot_tablee nella sua forma più pura è il modo più intuitivo per eseguire diverse attività.
  6. pd.factorize + np.bincount
    • Questa è una tecnica altamente avanzata che è molto oscura ma è molto veloce. Non può essere utilizzato in tutte le circostanze, ma quando può essere usato e ti senti a tuo agio nell'utilizzarlo, otterrai i frutti delle prestazioni.
  7. pd.get_dummies + pd.DataFrame.dot
    • Lo uso per eseguire tabulazioni incrociate in modo intelligente.

Esempi

Quello che ho intenzione di fare per ogni successiva risposta e domanda è rispondere usando pd.DataFrame.pivot_table. Quindi fornirò alternative per eseguire la stessa attività.

Domanda 3

Come faccio a ruotare in modo dftale che i colvalori siano colonne, i rowvalori siano l'indice, la media di val0siano i valori e i valori mancanti siano 0?

  • pd.DataFrame.pivot_table

    • fill_valuenon è impostato di default. Tendo a impostarlo in modo appropriato. In questo caso l'ho impostato su 0. Nota che ho saltato la domanda 2 poiché è la stessa di questa risposta senza ilfill_value
    • aggfunc='mean'è l'impostazione predefinita e non ho dovuto impostarlo. L'ho incluso per essere esplicito.

      df.pivot_table(
          values='val0', index='row', columns='col',
          fill_value=0, aggfunc='mean')
      
      col   col0   col1   col2   col3  col4
      row                                  
      row0  0.77  0.605  0.000  0.860  0.65
      row2  0.13  0.000  0.395  0.500  0.25
      row3  0.00  0.310  0.000  0.545  0.00
      row4  0.00  0.100  0.395  0.760  0.24
      
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].mean().unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc='mean').fillna(0)
    

Domanda 4

Posso avere qualcosa di diverso da mean, come forse sum?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc='sum')
    
    col   col0  col1  col2  col3  col4
    row                               
    row0  0.77  1.21  0.00  0.86  0.65
    row2  0.13  0.00  0.79  0.50  0.50
    row3  0.00  0.31  0.00  1.09  0.00
    row4  0.00  0.10  0.79  1.52  0.24
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].sum().unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc='sum').fillna(0)
    

Domanda 5

Posso fare più di una aggregazione alla volta?

Si noti che per pivot_tablee crosstabavevo bisogno di passare un elenco di callable. D'altra parte, groupby.aggè in grado di prendere le stringhe per un numero limitato di funzioni speciali. groupby.aggavrebbe anche preso gli stessi calibri che abbiamo passato agli altri, ma spesso è più efficiente sfruttare i nomi delle funzioni di stringa in quanto vi sono efficienze da guadagnare.

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns='col',
        fill_value=0, aggfunc=[np.size, np.mean])
    
         size                      mean                           
    col  col0 col1 col2 col3 col4  col0   col1   col2   col3  col4
    row                                                           
    row0    1    2    0    1    1  0.77  0.605  0.000  0.860  0.65
    row2    1    0    2    1    2  0.13  0.000  0.395  0.500  0.25
    row3    0    1    0    2    0  0.00  0.310  0.000  0.545  0.00
    row4    0    1    2    2    1  0.00  0.100  0.395  0.760  0.24
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].agg(['size', 'mean']).unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(
        index=df['row'], columns=df['col'],
        values=df['val0'], aggfunc=[np.size, np.mean]).fillna(0, downcast='infer')
    

Domanda 6

Posso aggregare su più colonne di valore?

  • pd.DataFrame.pivot_tablepassiamo values=['val0', 'val1']ma avremmo potuto lasciarlo completamente

    df.pivot_table(
        values=['val0', 'val1'], index='row', columns='col',
        fill_value=0, aggfunc='mean')
    
          val0                             val1                          
    col   col0   col1   col2   col3  col4  col0   col1  col2   col3  col4
    row                                                                  
    row0  0.77  0.605  0.000  0.860  0.65  0.01  0.745  0.00  0.010  0.02
    row2  0.13  0.000  0.395  0.500  0.25  0.45  0.000  0.34  0.440  0.79
    row3  0.00  0.310  0.000  0.545  0.00  0.00  0.230  0.00  0.075  0.00
    row4  0.00  0.100  0.395  0.760  0.24  0.00  0.070  0.42  0.300  0.46
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0', 'val1'].mean().unstack(fill_value=0)

Domanda 7

È possibile suddividere in più colonne?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index='row', columns=['item', 'col'],
        fill_value=0, aggfunc='mean')
    
    item item0             item1                         item2                   
    col   col2  col3  col4  col0  col1  col2  col3  col4  col0   col1  col3  col4
    row                                                                          
    row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.605  0.86  0.65
    row2  0.35  0.00  0.37  0.00  0.00  0.44  0.00  0.00  0.13  0.000  0.50  0.13
    row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.000  0.28  0.00
    row4  0.15  0.64  0.00  0.00  0.10  0.64  0.88  0.24  0.00  0.000  0.00  0.00
    
  • pd.DataFrame.groupby

    df.groupby(
        ['row', 'item', 'col']
    )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
    

Domanda 8

È possibile suddividere in più colonne?

  • pd.DataFrame.pivot_table

    df.pivot_table(
        values='val0', index=['key', 'row'], columns=['item', 'col'],
        fill_value=0, aggfunc='mean')
    
    item      item0             item1                         item2                  
    col        col2  col3  col4  col0  col1  col2  col3  col4  col0  col1  col3  col4
    key  row                                                                         
    key0 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.86  0.00
         row2  0.00  0.00  0.37  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.50  0.00
         row3  0.00  0.00  0.00  0.00  0.31  0.00  0.81  0.00  0.00  0.00  0.00  0.00
         row4  0.15  0.64  0.00  0.00  0.00  0.00  0.00  0.24  0.00  0.00  0.00  0.00
    key1 row0  0.00  0.00  0.00  0.77  0.00  0.00  0.00  0.00  0.00  0.81  0.00  0.65
         row2  0.35  0.00  0.00  0.00  0.00  0.44  0.00  0.00  0.00  0.00  0.00  0.13
         row3  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.28  0.00
         row4  0.00  0.00  0.00  0.00  0.10  0.00  0.00  0.00  0.00  0.00  0.00  0.00
    key2 row0  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.40  0.00  0.00
         row2  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.13  0.00  0.00  0.00
         row4  0.00  0.00  0.00  0.00  0.00  0.64  0.88  0.00  0.00  0.00  0.00  0.00
    
  • pd.DataFrame.groupby

    df.groupby(
        ['key', 'row', 'item', 'col']
    )['val0'].mean().unstack(['item', 'col']).fillna(0).sort_index(1)
    
  • pd.DataFrame.set_index perché il set di chiavi è unico sia per le righe che per le colonne

    df.set_index(
        ['key', 'row', 'item', 'col']
    )['val0'].unstack(['item', 'col']).fillna(0).sort_index(1)
    

Domanda 9

Posso aggregare la frequenza con cui la colonna e le righe si verificano insieme, alias "tabulazione incrociata"?

  • pd.DataFrame.pivot_table

    df.pivot_table(index='row', columns='col', fill_value=0, aggfunc='size')
    
        col   col0  col1  col2  col3  col4
    row                               
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
    
  • pd.DataFrame.groupby

    df.groupby(['row', 'col'])['val0'].size().unstack(fill_value=0)
  • pd.crosstab

    pd.crosstab(df['row'], df['col'])
  • pd.factorize + np.bincount

    # get integer factorization `i` and unique values `r`
    # for column `'row'`
    i, r = pd.factorize(df['row'].values)
    # get integer factorization `j` and unique values `c`
    # for column `'col'`
    j, c = pd.factorize(df['col'].values)
    # `n` will be the number of rows
    # `m` will be the number of columns
    n, m = r.size, c.size
    # `i * m + j` is a clever way of counting the 
    # factorization bins assuming a flat array of length
    # `n * m`.  Which is why we subsequently reshape as `(n, m)`
    b = np.bincount(i * m + j, minlength=n * m).reshape(n, m)
    # BTW, whenever I read this, I think 'Bean, Rice, and Cheese'
    pd.DataFrame(b, r, c)
    
          col3  col2  col0  col1  col4
    row3     2     0     0     1     0
    row2     1     2     1     0     2
    row0     1     0     1     2     1
    row4     2     2     0     1     1
    
  • pd.get_dummies

    pd.get_dummies(df['row']).T.dot(pd.get_dummies(df['col']))
    
          col0  col1  col2  col3  col4
    row0     1     2     0     1     1
    row2     1     0     2     1     2
    row3     0     1     0     2     0
    row4     0     1     2     2     1
    

Domanda 10

Come posso convertire un DataFrame da lungo a largo ruotando su SOLO due colonne?

Il primo passo è quello di assegnare un numero a ciascuna riga: questo numero sarà l'indice di riga di quel valore nel risultato pivotato. Questo viene fatto usando GroupBy.cumcount:

df2.insert(0, 'count', df.groupby('A').cumcount())
df2

   count  A   B
0      0  a   0
1      1  a  11
2      2  a   2
3      3  a  11
4      0  b  10
5      1  b  10
6      2  b  14
7      0  c   7

Il secondo passaggio consiste nell'utilizzare la colonna appena creata come indice da chiamare DataFrame.pivot.

df2.pivot(*df)
# df.pivot(index='count', columns='A', values='B')

A         a     b    c
count                 
0       0.0  10.0  7.0
1      11.0  10.0  NaN
2       2.0  14.0  NaN
3      11.0   NaN  NaN

Domanda 11

Come appiattire l'indice multiplo al singolo indice dopo pivot

Se columnsdigita objectcon stringajoin

df.columns = df.columns.map('|'.join)

altro format

df.columns = df.columns.map('{0[0]}|{0[1]}'.format) 

43
Potresti per favore prendere in considerazione l'estensione dei documenti ufficiali ?
MaxU

cosa è successo con la risposta alla domanda n. 10? Ho capito KeyError: 'A'. C'è di più alla risposta?
Monica Heddneck,

@MonicaHeddneck Esaminerò nuovamente e aggiornerò se necessario. Tuttavia, 'A'presuppone che ci sia una colonna 'A'nel tuo frame di dati da raggruppare.
piRSquared,

Posso aggregare su più colonne di valore? la risposta funzionerà per colonne di diverso tipo di dati. per es: valori = ['val0', 'val1'], qui val0 è int e val1 è stringa
Anil Kumar

1
non è necessario inserire la colonna nella domanda 10, può essere passata direttamente come argomento nella tabella pivot
risposta

4

Per estendere la risposta di @ piRSquared un'altra versione della domanda 10

Domanda 10.1

dataframe:

d = data = {'A': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 3, 6: 5},
 'B': {0: 'a', 1: 'b', 2: 'c', 3: 'a', 4: 'b', 5: 'a', 6: 'c'}}
df = pd.DataFrame(d)

   A  B
0  1  a
1  1  b
2  1  c
3  2  a
4  2  b
5  3  a
6  5  c

Produzione:

   0     1     2
A
1  a     b     c
2  a     b  None
3  a  None  None
5  c  None  None

Utilizzando df.groupbyepd.Series.tolist

t = df.groupby('A')['B'].apply(list)
out = pd.DataFrame(t.tolist(),index=t.index)
out
   0     1     2
A
1  a     b     c
2  a     b  None
3  a  None  None
5  c  None  None

O Un'alternativa molto migliore usando pd.pivot_tablecondf.squeeze.

t = df.pivot_table(index='A',values='B',aggfunc=list).squeeze()
out = pd.DataFrame(t.tolist(),index=t.index)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.