Bagaimana cara memutar bingkai data


358
  • Apa itu inden?
  • Bagaimana saya berputar?
  • Apakah ini poros?
  • Format panjang ke format lebar?

Saya telah melihat banyak pertanyaan yang bertanya tentang tabel pivot. Bahkan jika mereka tidak tahu bahwa mereka bertanya tentang tabel pivot, mereka biasanya begitu. Hampir tidak mungkin untuk menulis pertanyaan dan jawaban kanonik yang mencakup semua aspek berputar ...

... Tapi aku akan mencobanya.


Masalah dengan pertanyaan dan jawaban yang ada adalah bahwa seringkali pertanyaan itu difokuskan pada nuansa bahwa OP mengalami kesulitan generalisasi untuk menggunakan sejumlah jawaban baik yang ada. Namun, tidak ada jawaban yang mencoba memberikan penjelasan yang komprehensif (karena itu tugas yang menakutkan)

Lihat beberapa contoh dari pencarian google saya

  1. Bagaimana cara memutar bingkai data di Panda?
    • Pertanyaan dan jawaban yang bagus. Tetapi jawabannya hanya menjawab pertanyaan spesifik dengan sedikit penjelasan.
  2. panda pivot table ke bingkai data
    • Dalam pertanyaan ini, OP prihatin dengan output pivot. Yaitu bagaimana tampilan kolom. OP ingin agar terlihat seperti R. Ini tidak sangat membantu bagi pengguna panda.
  3. panda memutar bingkai data, duplikat baris
    • Pertanyaan layak lainnya tetapi jawabannya berfokus pada satu metode, yaitu pd.DataFrame.pivot

Jadi setiap kali seseorang mencari pivotmereka mendapatkan hasil sporadis yang kemungkinan tidak akan menjawab pertanyaan spesifik mereka.


Mendirikan

Anda mungkin memperhatikan bahwa saya secara mencolok menamai kolom saya dan nilai kolom yang relevan agar sesuai dengan bagaimana saya akan berputar dalam jawaban di bawah ini.

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

Pertanyaan

  1. Kenapa saya bisa ValueError: Index contains duplicate entries, cannot reshape

  2. Bagaimana cara saya berporos dfsehingga colnilainya adalah kolom, rownilainya adalah indeks, dan rata-rata val0nilainya?

    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. Bagaimana cara saya berporos dfsehingga colnilainya adalah kolom, rownilainya adalah indeks, val0nilainya adalah nilainya, dan nilainya hilang 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. Bisakah saya mendapatkan sesuatu selain mean, seperti mungkin 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. Bisakah saya melakukan lebih dari satu agregasi sekaligus?

           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. Bisakah saya menggabungkan beberapa kolom nilai?

          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. Bisakah Dibagi lagi dengan banyak kolom?

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

    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. Dapatkah saya menggabungkan frekuensi di mana kolom dan baris muncul bersamaan, alias "tabulasi silang"?

    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. Bagaimana cara mengonversi DataFrame dari panjang ke lebar dengan berputar pada HANYA dua kolom? Diberikan,

    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

    Yang diharapkan akan terlihat seperti

          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. Bagaimana cara meratakan beberapa indeks menjadi satu indeks setelahnya pivot

    Dari

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

    Untuk

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

Jawaban:


301

Kami mulai dengan menjawab pertanyaan pertama:

pertanyaan 1

Kenapa saya bisa ValueError: Index contains duplicate entries, cannot reshape

Ini terjadi karena panda sedang berusaha untuk mengindeks ulang baik a columnsatau indexobjek dengan entri duplikat. Ada berbagai metode untuk digunakan yang dapat melakukan inden. Beberapa dari mereka tidak cocok ketika ada duplikat kunci yang diminta untuk diputar. Sebagai contoh. Pertimbangkan pd.DataFrame.pivot. Saya tahu ada entri duplikat yang berbagi rowdan colnilai:

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

True

Jadi saat saya pivotmenggunakan

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

Saya mendapatkan kesalahan yang disebutkan di atas. Bahkan, saya mendapatkan kesalahan yang sama ketika saya mencoba melakukan tugas yang sama dengan:

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

Berikut adalah daftar idiom yang dapat kita gunakan untuk berputar

  1. pd.DataFrame.groupby + pd.DataFrame.unstack
    • Pendekatan umum yang baik untuk melakukan hampir semua jenis inden
    • Anda menentukan semua kolom yang akan membentuk level baris dan level kolom yang diputar dalam satu grup oleh. Anda mengikutinya dengan memilih kolom yang tersisa yang ingin Anda agregat dan fungsi yang ingin Anda lakukan agregasi. Akhirnya, Anda unstacklevel yang Anda inginkan dalam indeks kolom.
  2. pd.DataFrame.pivot_table
    • Versi yang dimuliakan groupbydengan API yang lebih intuitif. Bagi banyak orang, ini adalah pendekatan yang disukai. Dan merupakan pendekatan yang dimaksudkan oleh para pengembang.
    • Tentukan level baris, level kolom, nilai yang akan diagregasi, dan fungsi untuk melakukan agregasi.
  3. pd.DataFrame.set_index + pd.DataFrame.unstack
    • Nyaman dan intuitif untuk sebagian orang (termasuk saya sendiri). Tidak dapat menangani duplikat kunci yang dikelompokkan.
    • Mirip dengan groupbyparadigma, kami menentukan semua kolom yang pada akhirnya akan menjadi level baris atau kolom dan mengaturnya sebagai indeks. Kami kemudian unstacktingkat yang kami inginkan di kolom. Jika level indeks atau level kolom yang tersisa tidak unik, metode ini akan gagal.
  4. pd.DataFrame.pivot
    • Sangat mirip dengan set_indexyang berbagi batasan kunci duplikat. API juga sangat terbatas. Hanya membutuhkan nilai-nilai skalar untuk index, columns, values.
    • Mirip dengan pivot_tablemetode yang kita pilih baris, kolom, dan nilai yang akan diputar. Namun, kami tidak dapat mengumpulkan dan jika baris atau kolom tidak unik, metode ini akan gagal.
  5. pd.crosstab
    • Ini versi khusus pivot_tabledan dalam bentuk paling murni adalah cara paling intuitif untuk melakukan beberapa tugas.
  6. pd.factorize + np.bincount
    • Ini adalah teknik yang sangat canggih yang sangat tidak jelas tetapi sangat cepat. Ini tidak dapat digunakan dalam semua keadaan, tetapi ketika itu dapat digunakan dan Anda merasa nyaman menggunakannya, Anda akan menuai imbalan kinerja.
  7. pd.get_dummies + pd.DataFrame.dot
    • Saya menggunakan ini untuk melakukan tabulasi silang secara cerdik.

Contohnya

Apa yang akan saya lakukan untuk setiap jawaban dan pertanyaan berikutnya adalah menjawabnya dengan menggunakan pd.DataFrame.pivot_table. Maka saya akan memberikan alternatif untuk melakukan tugas yang sama.

Pertanyaan 3

Bagaimana cara saya berporos dfsehingga colnilainya adalah kolom, rownilainya adalah indeks, val0nilainya adalah nilainya, dan nilainya hilang 0?

  • pd.DataFrame.pivot_table

    • fill_valuetidak diatur secara default. Saya cenderung mengaturnya dengan tepat. Dalam hal ini saya mengaturnya 0. Perhatikan saya melewatkan pertanyaan 2 karena sama dengan jawaban ini tanpafill_value
    • aggfunc='mean'adalah default dan saya tidak perlu mengaturnya. Saya memasukkannya secara eksplisit.

      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)

Pertanyaan 4

Bisakah saya mendapatkan sesuatu selain mean, seperti mungkin 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)

Pertanyaan 5

Bisakah saya melakukan lebih dari satu agregasi sekaligus?

Perhatikan bahwa untuk pivot_tabledan crosstabsaya harus melewati daftar perlengkapan. Di sisi lain, groupby.aggdapat mengambil string untuk sejumlah fungsi khusus. groupby.aggmungkin juga menggunakan callable yang sama dengan yang kami berikan kepada yang lain, tetapi seringkali lebih efisien untuk memanfaatkan nama fungsi string karena ada efisiensi yang bisa diperoleh.

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

Pertanyaan 6

Bisakah saya menggabungkan beberapa kolom nilai?

  • pd.DataFrame.pivot_tablekita lulus values=['val0', 'val1']tetapi kita bisa meninggalkan itu sepenuhnya

    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)

Pertanyaan 7

Bisakah Dibagi lagi dengan banyak kolom?

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

Pertanyaan 8

Bisakah Dibagi lagi dengan banyak kolom?

  • 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 karena set kunci unik untuk baris dan kolom

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

Pertanyaan 9

Dapatkah saya menggabungkan frekuensi di mana kolom dan baris muncul bersamaan, alias "tabulasi silang"?

  • 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

Pertanyaan 10

Bagaimana cara mengonversi DataFrame dari panjang ke lebar dengan berputar pada HANYA dua kolom?

Langkah pertama adalah menetapkan angka untuk setiap baris - angka ini akan menjadi indeks baris dari nilai itu dalam hasil yang diputar. Ini dilakukan dengan menggunakan 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

Langkah kedua adalah menggunakan kolom yang baru dibuat sebagai indeks untuk memanggil 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

Pertanyaan 11

Bagaimana cara meratakan beberapa indeks menjadi satu indeks setelahnya pivot

Jika columnsmengetik objectdengan stringjoin

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

lain format

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

43
Bisakah Anda mempertimbangkan untuk memperpanjang dokumen resmi ?
Maks

apa yang terjadi dengan jawaban untuk Pertanyaan # 10? Saya mengerti KeyError: 'A'. Apakah ada lebih banyak jawaban?
Monica Heddneck

@MonicaHeddneck saya akan memeriksanya lagi dan memperbarui jika perlu. Namun, 'A'anggap ada kolom 'A'dalam bingkai data Anda untuk dikelompokkan berdasarkan.
piRquared

Bisakah saya menggabungkan beberapa kolom nilai? akan jawaban untuk ini akan berfungsi untuk kolom dari tipe data yang berbeda. untuk ex: values ​​= ['val0', 'val1'], di sini val0 adalah int dan val1 adalah string
Anil Kumar

1
tidak perlu memasukkan kolom pada pertanyaan 10, dapat dilewatkan secara langsung sebagai argumen dalam tabel pivot
ansev

4

Untuk memperluas jawaban @ piRSquared versi lain dari Pertanyaan 10

Pertanyaan 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

Keluaran:

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

Menggunakan df.groupbydanpd.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

Atau A jauh lebih baik alternatif menggunakan pd.pivot_tabledengandf.squeeze.

t = df.pivot_table(index='A',values='B',aggfunc=list).squeeze()
out = pd.DataFrame(t.tolist(),index=t.index)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.