Як зібрати кадр даних


360
  • Що таке стрижень?
  • Як зробити шарнір?
  • Це стрижень?
  • Довгий формат до широкого формату?

Я бачив безліч питань, які задають питання про зведені таблиці. Навіть якщо вони не знають, що запитують про зведені таблиці, вони зазвичай є. Написати канонічне запитання та відповідь практично неможливо, що охоплює всі аспекти повороту….

... Але я збираюся дати йому піти.


Проблема існуючих питань та відповідей полягає в тому, що часто питання зосереджується на нюансі, що ОП має проблеми із узагальненням, щоб використовувати ряд існуючих хороших відповідей. Однак жодна з відповідей не намагається дати вичерпне пояснення (адже це непросте завдання)

Подивіться кілька прикладів з мого пошуку в Google

  1. Як зібрати кадр даних у Pandas?
    • Гарне запитання та відповідь. Але відповідь відповідає лише на конкретне питання з невеликим поясненням.
  2. панда зведена таблиця до кадру даних
    • У цьому питанні ОП стосується виходу стрижня. А саме як виглядають стовпці. OP хотіла, щоб це виглядало як R. Це не дуже корисно для користувачів панди.
  3. панди, що наводять фрейм даних, дублюють рядки
    • Ще одне пристойне питання, але відповідь зосереджується на одному методі, а саме pd.DataFrame.pivot

Отже, коли хтось шукає, pivotвони отримують спорадичні результати, які, ймовірно, не дадуть відповіді на їх конкретне запитання.


Налаштування

Ви можете помітити, що я помітно називав свої стовпці та відповідні значення стовпців, щоб відповідати тому, як я збираюся переходити у відповідях нижче.

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

Питання (и)

  1. Чому я отримую ValueError: Index contains duplicate entries, cannot reshape

  2. Як згорнути dfтак, щоб colзначення були стовпцями, rowзначення - індексом, а середнє значення val0- значеннями?

    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. Як згорнути dfтак, щоб colзначення були стовпцями, rowзначення - індексом, середні значення val0- значеннями, а відсутні значення - 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. Чи можу я отримати щось інше, ніж mean, як, можливо 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. Чи можу я зробити більше одного агрегації за раз?

           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. Чи можу я об'єднатись у кілька стовпців значень?

          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. Чи можна розділити на кілька стовпців?

    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. Або

    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. Чи можу я об'єднати частоту, в якій стовпець і рядки зустрічаються разом, також "перехресне табулювання"?

    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. Як перетворити DataFrame з довгого в широкий, поводячи ТІЛЬКИ два стовпці? Дано,

    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

    Очікуване має виглядати приблизно так

          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. Як зрівняти множинний індекс в один індекс після pivot

    З

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

    До

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

Відповіді:


302

Почнемо з відповіді на перше запитання:

питання 1

Чому я отримую ValueError: Index contains duplicate entries, cannot reshape

Це відбувається тому, що панди намагаються перевстановити або a columnsабо indexоб'єкт із дублюючими записами. Існують різні методи використання, які можуть виконати поворот. Деякі з них не дуже підходять, коли є дублікати клавіш, в які його просять ввімкнути. Наприклад. Розглянемо pd.DataFrame.pivot. Я знаю, що є повторювані записи, які поділяють значення rowта colзначення:

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

True

Тож коли я pivotкористуюсь

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

Я отримую помилку, згадану вище. Насправді я отримую ту ж помилку, коли намагаюся виконувати те саме завдання з:

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

Ось перелік ідіом, які ми можемо використовувати для зведення

  1. pd.DataFrame.groupby + pd.DataFrame.unstack
    • Хороший загальний підхід для виконання майже будь-якого типу стрижня
    • Ви вказуєте всі стовпці, які будуть складати зведені рівні рядків та рівні стовпців в одній групі. Виконайте це, вибравши решту стовпців, які ви хочете агрегувати, та функцію (функції), яку ви хочете виконати агрегацією. Нарешті, ви unstackвизначаєте рівні, які ви хочете бути в індексі стовпців.
  2. pd.DataFrame.pivot_table
    • Прославлена ​​версія groupbyз більш інтуїтивно зрозумілим API. Для багатьох людей це кращий підхід. І це задуманий підхід розробників.
    • Укажіть рівень рядків, рівні стовпців, значення, які потрібно агрегувати, та функції (функції) для виконання агрегації.
  3. pd.DataFrame.set_index + pd.DataFrame.unstack
    • Зручний і інтуїтивний для деяких (я включаю в себе). Неможливо обробити повторювані згруповані ключі.
    • Аналогічно groupbyпарадигмі, ми визначаємо всі стовпці, які в кінцевому підсумку будуть або рівнями рядків, або стовпців, і встановлюємо їх як індекс. Тоді unstackми робимо потрібні рівні в стовпцях. Якщо або інші рівні індексу, або рівні стовпців не є унікальними, цей спосіб не вдасться.
  4. pd.DataFrame.pivot
    • Дуже схожий на set_indexте, що він має обмеження дублюючого ключа. API також дуже обмежений. Він приймає тільки скалярні значення index, columns, values.
    • Аналогічно pivot_tableметоду в тому, що ми вибираємо рядки, стовпці та значення, на яких слід перемикати. Однак ми не можемо об'єднати, і якщо рядки чи стовпці не є унікальними, цей спосіб не вдасться.
  5. pd.crosstab
    • Ця спеціалізована версія pivot_tableі в найчистішому вигляді є найбільш інтуїтивним способом виконання декількох завдань.
  6. pd.factorize + np.bincount
    • Це дуже вдосконалена методика, яка дуже незрозуміла, але дуже швидка. Він не може бути використаний за будь-яких обставин, але коли його можна буде використовувати і вам зручніше, ви отримаєте винагороду за продуктивність.
  7. pd.get_dummies + pd.DataFrame.dot
    • Я використовую це для спритного виконання перехресних таблиць.

Приклади

Що я буду робити для кожної наступної відповіді та запитання, це відповісти на неї pd.DataFrame.pivot_table. Тоді я надам альтернативи для виконання того ж завдання.

Питання 3

Як згорнути dfтак, щоб colзначення були стовпцями, rowзначення - індексом, середні значення val0- значеннями, а відсутні значення - 0?

  • pd.DataFrame.pivot_table

    • fill_valueне встановлено за замовчуванням. Я схильний встановлювати це відповідним чином. У цьому випадку я його встановив 0. Зауважте, я пропустив питання 2, оскільки це те саме, що і ця відповідь безfill_value
    • aggfunc='mean'є за замовчуванням, і я не повинен був його встановлювати. Я включив це, щоб бути явним.

      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)

Питання 4

Чи можу я отримати щось інше, ніж mean, як, можливо 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)

Питання 5

Чи можу я зробити більше одного агрегації за раз?

Зверніть увагу , що для pivot_tableі crosstabмені потрібно , щоб передати список викликаних об'єктів. З іншого боку, groupby.aggвміє приймати рядки для обмеженої кількості спеціальних функцій. groupby.aggТакож було б прийнято ті самі дзвінки, які ми передавали іншим, але часто ефективніше використовувати назви функцій рядка, оскільки є ефективність, яку потрібно отримати.

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

Питання 6

Чи можу я об'єднатись у кілька стовпців значень?

  • pd.DataFrame.pivot_tableми проходимо, values=['val0', 'val1']але ми могли це повністю залишити

    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)

Питання 7

Чи можна розділити на кілька стовпців?

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

Питання 8

Чи можна розділити на кілька стовпців?

  • 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 тому що набір клавіш унікальний і для рядків, і для стовпців

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

Питання 9

Чи можу я об'єднати частоту, в якій стовпець і рядки зустрічаються разом, також "перехресне табулювання"?

  • 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

Питання 10

Як перетворити DataFrame з довгого в широкий, поводячи ТІЛЬКИ два стовпці?

Перший крок - присвоїти число кожному рядку - це число буде індексом рядків цього значення у зворотному результаті. Це робиться за допомогою 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

Другий крок - використовувати новостворений стовпець як індекс для виклику 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

Питання 11

Як зрівняти множинний індекс в один індекс після pivot

Якщо columnsвведіть objectрядокjoin

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

ще format

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

43
Не могли б ви розглянути можливість продовження офіційних документів ?
MaxU

що сталося з відповіддю на запитання №10? Я отримую KeyError: 'A'. Чи є ще відповідь?
Моніка Геднек

@MonicaHeddneck я перегляну його ще раз та оновіть, якщо потрібно. Однак, 'A'якщо припустити, що 'A'у вашому кадрі даних стовпчик можна згрупувати.
piRSquared

Чи можу я об'єднатись у кілька стовпців значень? відповідь на це буде працювати для стовпців різного типу даних. для ex: values ​​= ['val0', 'val1'], тут val0 є int, а val1 - рядок
Аніл Кумар

1
не потрібно вставляти стовпчик у питанні 10, він може бути переданий безпосередньо як аргумент у зведеній таблиці
ansev

4

Щоб продовжити відповідь @ piRSquared на іншу версію питання 10

Питання 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

Вихід:

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

Використання df.groupbyтаpd.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

Або Набагато краща альтернатива використання pd.pivot_tableзdf.squeeze.

t = df.pivot_table(index='A',values='B',aggfunc=list).squeeze()
out = pd.DataFrame(t.tolist(),index=t.index)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.