Jak obrócić ramkę danych


358
  • Co to jest oś obrotu?
  • Jak się obracać?
  • Czy to jest oś obrotu?
  • Długi format do szerokiego formatu?

Widziałem wiele pytań dotyczących tabel przestawnych. Nawet jeśli nie wiedzą, że pytają o tabele przestawne, zwykle tak są. Praktycznie niemożliwe jest napisanie kanonicznego pytania i odpowiedzi, które obejmują wszystkie aspekty obrotu ...

... Ale spróbuję.


Problem z istniejącymi pytaniami i odpowiedziami polega na tym, że często pytanie koncentruje się na niuansie, który PO ma problem z uogólnieniem w celu wykorzystania szeregu istniejących dobrych odpowiedzi. Jednak żadna z odpowiedzi nie zawiera wyczerpującego wyjaśnienia (ponieważ jest to trudne zadanie)

Spójrz na kilka przykładów z mojej wyszukiwarki Google

  1. Jak przestawić ramkę danych w Pandach?
    • Dobre pytanie i odpowiedź. Ale odpowiedź odpowiada tylko na konkretne pytanie z niewielkim wyjaśnieniem.
  2. tabela przestawna pandy do ramki danych
    • W tym pytaniu PO dotyczy wyjścia pivot. Mianowicie, jak wyglądają kolumny. OP chciał, aby wyglądało to jak R. Nie jest to zbyt pomocne dla użytkowników pand.
  3. pandy obracające ramkę danych, zduplikowane wiersze
    • Kolejne przyzwoite pytanie, ale odpowiedź skupia się na jednej metodzie, a mianowicie pd.DataFrame.pivot

Tak więc, gdy ktoś szuka pivot, uzyskuje sporadyczne wyniki, które prawdopodobnie nie odpowiedzą na konkretne pytanie.


Ustawiać

Możesz zauważyć, że wyraźnie nazwałem moje kolumny i odpowiednie wartości kolumn, aby odpowiadały temu, w jaki sposób przestawię się w odpowiedziach poniżej.

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

Pytania)

  1. Dlaczego dostaję ValueError: Index contains duplicate entries, cannot reshape

  2. Jak obrócić df, aby colwartości były kolumnami, rowwartości indeksami, a średnią val0wartości?

    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. Jak obrócić df, aby colwartości były kolumnami, rowwartości były indeksem, średnią z val0wartości, a brakującymi wartościami 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. Czy mogę dostać coś innego niż mean, na przykład 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. Czy mogę zrobić więcej niż jedną agregację na raz?

           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. Czy mogę agregować w wielu kolumnach wartości?

          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. Czy można podzielić według wielu kolumn?

    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. Lub

    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. Czy mogę agregować częstotliwość, w której kolumna i wiersze występują razem, czyli „tabulacja krzyżowa”?

    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. Jak przekonwertować ramkę danych z długiej na szeroką, obracając TYLKO dwie kolumny? Dany,

    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
    

    Oczekiwany powinien wyglądać mniej więcej tak

          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. Jak spłaszczyć indeks wielokrotny do pojedynczego indeksu po pivot

    Od

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

    Do

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

Odpowiedzi:


301

Zaczynamy od odpowiedzi na pierwsze pytanie:

Pytanie 1

Dlaczego dostaję ValueError: Index contains duplicate entries, cannot reshape

Dzieje się tak, ponieważ pandy próbują reindeksować albo obiekt columnslub indexze zduplikowanymi wpisami. Istnieją różne metody użycia, które mogą wykonać przestawienie. Niektóre z nich nie są odpowiednie, gdy istnieją duplikaty kluczy, w których prosi się o przestawienie. Na przykład. Zastanów się pd.DataFrame.pivot. Wiem, że istnieją zduplikowane wpisy, które dzielą wartości rowi col:

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

True

Więc kiedy pivotużywam

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

Pojawia się błąd wymieniony powyżej. W rzeczywistości pojawia się ten sam błąd, gdy próbuję wykonać to samo zadanie z:

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

Oto lista idiomów, których możemy użyć do przestawienia

  1. pd.DataFrame.groupby + pd.DataFrame.unstack
    • Dobre ogólne podejście do wykonywania praktycznie każdego rodzaju obrotu
    • Podajesz wszystkie kolumny, które będą tworzyły poziomy wierszy i poziomy kolumn w jednej grupie przez. Następnie wybierasz pozostałe kolumny, które chcesz agregować, oraz funkcje, które chcesz przeprowadzić agregację. Wreszcie, unstackpoziomy, które chcesz być w indeksie kolumny.
  2. pd.DataFrame.pivot_table
    • Uwielbiona wersja groupbyz bardziej intuicyjnym interfejsem API. Dla wielu osób jest to preferowane podejście. I jest to zamierzone podejście deweloperów.
    • Określ poziom wiersza, poziomy kolumn, wartości, które mają być agregowane, oraz funkcje, które mają służyć do agregowania.
  3. pd.DataFrame.set_index + pd.DataFrame.unstack
    • Dla niektórych wygodny i intuicyjny (w tym ja). Nie można obsłużyć duplikatów zgrupowanych kluczy.
    • Podobnie jak w groupbyparadygmacie, określamy wszystkie kolumny, które ostatecznie będą poziomami wierszy lub kolumn, i ustawiamy je na indeks. Następnie unstackmamy poziomy, które chcemy w kolumnach. Jeśli pozostałe poziomy indeksu lub poziomy kolumn nie są unikalne, ta metoda zakończy się niepowodzeniem.
  4. pd.DataFrame.pivot
    • Bardzo podobny do set_indextego, że dzieli to samo ograniczenie klucza. Interfejs API jest również bardzo ograniczony. To trwa tylko wartości skalarne dla index, columns, values.
    • Podobnie do pivot_tablemetody polegającej na tym, że wybieramy wiersze, kolumny i wartości, na których mają się obracać. Nie możemy jednak agregować, a jeśli wiersze lub kolumny nie są unikalne, ta metoda zawiedzie.
  5. pd.crosstab
    • Ta wyspecjalizowana wersja pivot_tablew najczystszej postaci jest najbardziej intuicyjnym sposobem wykonywania kilku zadań.
  6. pd.factorize + np.bincount
    • Jest to bardzo zaawansowana technika, która jest bardzo niejasna, ale bardzo szybka. Nie można go używać w każdych okolicznościach, ale kiedy można go używać i czujesz się swobodnie, będziesz zbierać nagrody za wydajność.
  7. pd.get_dummies + pd.DataFrame.dot
    • Używam tego do sprytnie wykonującego zestawienia krzyżowego.

Przykłady

Dla każdej kolejnej odpowiedzi i pytania zamierzam odpowiedzieć za pomocą pd.DataFrame.pivot_table. Następnie przedstawię alternatywy do wykonania tego samego zadania.

pytanie 3

Jak obrócić df, aby colwartości były kolumnami, rowwartości były indeksem, średnią z val0wartości, a brakującymi wartościami 0?

  • pd.DataFrame.pivot_table

    • fill_valuenie jest ustawiony domyślnie. Staram się to odpowiednio ustawiać. W tym przypadku ustawiłem to na 0. Zauważ, że pominąłem pytanie 2, ponieważ jest to to samo co ta odpowiedź bezfill_value
    • aggfunc='mean'jest ustawieniem domyślnym i nie musiałem go ustawiać. Zamieściłem to dla jasności.

      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)
    

Pytanie 4

Czy mogę dostać coś innego niż mean, na przykład 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)
    

Pytanie 5

Czy mogę zrobić więcej niż jedną agregację na raz?

Zauważ, że dla pivot_tablei crosstabmusiałem przekazać listę kallabów. Z drugiej strony groupby.aggjest w stanie przyjmować ciągi znaków dla ograniczonej liczby funkcji specjalnych. groupby.aggwziąłby również te same kallaby, które przekazaliśmy innym, ale często bardziej efektywne jest wykorzystanie nazw funkcji łańcuchowych, ponieważ można zwiększyć wydajność.

  • 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')
    

Pytanie 6

Czy mogę agregować w wielu kolumnach wartości?

  • pd.DataFrame.pivot_tablemijamy, values=['val0', 'val1']ale moglibyśmy to całkowicie pominąć

    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)

Pytanie 7

Czy można podzielić według wielu kolumn?

  • 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)
    

Pytanie 8

Czy można podzielić według wielu kolumn?

  • 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 ponieważ zestaw kluczy jest unikalny zarówno dla wierszy, jak i kolumn

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

Pytanie 9

Czy mogę agregować częstotliwość, w której kolumna i wiersze występują razem, czyli „tabulacja krzyżowa”?

  • 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

Pytanie 10

Jak przekonwertować ramkę danych z długiej na szeroką, obracając TYLKO dwie kolumny?

Pierwszym krokiem jest przypisanie liczby do każdego wiersza - liczba ta będzie indeksem wiersza tej wartości w wyniku obrotu. Odbywa się to za pomocą 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

Drugim krokiem jest użycie nowo utworzonej kolumny jako indeksu do wywołania 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

Pytanie 11

Jak spłaszczyć indeks wielokrotny do pojedynczego indeksu po pivot

Jeśli columnswpisz objectciągjoin

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

jeszcze format

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

43
Czy możesz rozważyć rozszerzenie oficjalnych dokumentów ?
MaxU

co się stało z odpowiedzią na pytanie nr 10? I dostać KeyError: 'A'. Czy jest więcej odpowiedzi?
Monica Heddneck

@MonicaHeddneck Przejrzę go jeszcze raz i w razie potrzeby zaktualizuję. Zakłada się jednak, 'A'że 'A'w ramce danych znajduje się kolumna do grupowania według.
piRSquared

Czy mogę agregować w wielu kolumnach wartości? odpowiedź na to będzie działać dla kolumn różnego typu danych. na przykład: wartości = ['val0', 'val1'], tutaj val0 to int, a val1 to string
Anil Kumar

1
nie jest konieczne wstawianie kolumny w pytaniu 10, można ją przekazać bezpośrednio jako argument w tabeli przestawnej
ansev

4

Aby przedłużyć odpowiedź @ piRSquared o inną wersję pytania 10

Pytanie 10.1

Ramka danych:

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

Wynik:

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

Korzystanie df.groupbyipd.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

Lub O wiele lepsza alternatywa przy użyciu pd.pivot_tablezdf.squeeze.

t = df.pivot_table(index='A',values='B',aggfunc=list).squeeze()
out = pd.DataFrame(t.tolist(),index=t.index)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.