Làm thế nào để xoay vòng dữ liệu


358
  • Trục là gì?
  • Làm thế nào để tôi xoay vòng?
  • Đây có phải là một trục?
  • Định dạng dài sang định dạng rộng?

Tôi đã thấy rất nhiều câu hỏi về bảng xoay. Ngay cả khi họ không biết rằng họ đang hỏi về các bảng trụ, họ vẫn thường như vậy. Hầu như không thể viết một câu hỏi và câu trả lời chính tắc bao gồm tất cả các khía cạnh của xoay vòng ....

... Nhưng tôi sẽ cho nó đi.


Vấn đề với các câu hỏi và câu trả lời hiện tại là thường câu hỏi tập trung vào một sắc thái mà OP gặp khó khăn trong việc khái quát hóa để sử dụng một số câu trả lời tốt hiện có. Tuy nhiên, không có câu trả lời nào cố gắng đưa ra lời giải thích toàn diện (vì đó là một nhiệm vụ khó khăn)

Nhìn một vài ví dụ từ tìm kiếm google của tôi

  1. Làm thế nào để xoay một khung dữ liệu trong Pandas?
    • Câu hỏi và trả lời tốt. Nhưng câu trả lời chỉ trả lời câu hỏi cụ thể với ít lời giải thích.
  2. bảng xoay gấu trúc vào khung dữ liệu
    • Trong câu hỏi này, OP quan tâm đến đầu ra của trục. Cụ thể là các cột trông như thế nào. OP muốn nó trông giống như R. Điều này không hữu ích cho người dùng gấu trúc.
  3. gấu trúc xoay vòng một khung dữ liệu, các hàng trùng lặp
    • Một câu hỏi hay khác nhưng câu trả lời tập trung vào một phương pháp, cụ thể là pd.DataFrame.pivot

Vì vậy, bất cứ khi nào ai đó tìm kiếm pivothọ đều nhận được kết quả lẻ tẻ có khả năng sẽ không trả lời câu hỏi cụ thể của họ.


Thiết lập

Bạn có thể nhận thấy rằng tôi dễ dàng đặt tên cho các cột của mình và các giá trị cột có liên quan để tương ứng với cách tôi sẽ xoay vòng trong các câu trả lời bên dưới.

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

Câu hỏi

  1. Tại sao tôi nhận được ValueError: Index contains duplicate entries, cannot reshape

  2. Làm thế nào để tôi xoay vòng dfsao cho các colgiá trị là cột, rowgiá trị là chỉ mục và val0giá trị trung bình của các giá trị?

    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. Làm thế nào để tôi xoay vòng dfsao cho các colgiá trị là cột, rowgiá trị là chỉ mục, val0giá trị trung bình là các giá trị và giá trị bị thiếu là 0gì?

    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. Tôi có thể nhận được một cái gì đó khác hơn mean, như có thể 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. Tôi có thể làm nhiều hơn một tập hợp tại một thời điểm không?

           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. Tôi có thể tổng hợp trên nhiều cột giá trị không?

          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. Subdivide có thể bằng nhiều cột?

    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. Hoặc là

    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. Tôi có thể tổng hợp tần suất mà cột và các hàng xuất hiện cùng nhau không, hay còn gọi là "bảng chéo"?

    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. Làm cách nào để chuyển đổi DataFrame từ dài sang rộng bằng cách xoay vòng CHỈ trên hai cột? Được,

    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

    Dự kiến ​​sẽ trông giống như

          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. Làm cách nào để làm phẳng nhiều chỉ mục thành một chỉ mục sau pivot

    Từ

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

    Đến

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

Câu trả lời:


301

Chúng tôi bắt đầu bằng cách trả lời câu hỏi đầu tiên:

Câu hỏi 1

Tại sao tôi nhận được ValueError: Index contains duplicate entries, cannot reshape

Điều này xảy ra bởi vì gấu trúc đang cố gắng giới thiệu lại một columnshoặc một indexđối tượng với các mục trùng lặp. Có nhiều phương pháp khác nhau để sử dụng có thể thực hiện một trục. Một số trong số chúng không phù hợp khi có các bản sao của các phím mà nó được yêu cầu xoay vòng. Ví dụ. Hãy xem xét pd.DataFrame.pivot. Tôi biết có các mục trùng lặp chia sẻ rowcolgiá trị:

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

True

Vì vậy, khi tôi pivotsử dụng

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

Tôi nhận được lỗi được đề cập ở trên. Trong thực tế, tôi gặp lỗi tương tự khi tôi cố gắng thực hiện cùng một tác vụ với:

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

Dưới đây là danh sách các thành ngữ chúng ta có thể sử dụng để xoay vòng

  1. pd.DataFrame.groupby + pd.DataFrame.unstack
    • Cách tiếp cận chung tốt để thực hiện bất kỳ loại trục nào
    • Bạn chỉ định tất cả các cột sẽ tạo thành các cấp hàng có trục và cấp cột trong một nhóm theo. Bạn làm theo điều đó bằng cách chọn các cột còn lại bạn muốn tổng hợp và (các) chức năng bạn muốn thực hiện tổng hợp. Cuối cùng, bạn unstackcấp độ mà bạn muốn có trong chỉ mục cột.
  2. pd.DataFrame.pivot_table
    • Một phiên bản được tôn vinh groupbyvới API trực quan hơn. Đối với nhiều người, đây là phương pháp ưa thích. Và là cách tiếp cận dự định của các nhà phát triển.
    • Chỉ định cấp hàng, cấp cột, giá trị được tổng hợp và (các) chức năng để thực hiện tổng hợp.
  3. pd.DataFrame.set_index + pd.DataFrame.unstack
    • Thuận tiện và trực quan cho một số (bao gồm cả bản thân tôi). Không thể xử lý các khóa được nhóm trùng lặp.
    • Tương tự như groupbymô hình, chúng tôi chỉ định tất cả các cột cuối cùng sẽ là các mức hàng hoặc cột và đặt các cột đó là chỉ mục. Chúng tôi sau đó unstackcác cấp độ chúng tôi muốn trong các cột. Nếu các mức chỉ mục hoặc mức cột còn lại không phải là duy nhất, phương pháp này sẽ thất bại.
  4. pd.DataFrame.pivot
    • Rất giống với set_indexnó chia sẻ giới hạn khóa trùng lặp. API cũng rất hạn chế. Nó chỉ mất giá trị vô hướng cho index, columns, values.
    • Tương tự như pivot_tablephương thức trong đó chúng ta chọn các hàng, cột và giá trị để xoay vòng. Tuy nhiên, chúng tôi không thể tổng hợp và nếu một trong hai hàng hoặc cột không phải là duy nhất, phương thức này sẽ thất bại.
  5. pd.crosstab
    • Đây là phiên bản chuyên biệt của pivot_tablevà ở dạng tinh khiết nhất là cách trực quan nhất để thực hiện một số tác vụ.
  6. pd.factorize + np.bincount
    • Đây là một kỹ thuật rất tiên tiến, rất tối nghĩa nhưng rất nhanh. Nó không thể được sử dụng trong mọi trường hợp, nhưng khi nó có thể được sử dụng và bạn cảm thấy thoải mái khi sử dụng nó, bạn sẽ gặt hái được những phần thưởng hiệu suất.
  7. pd.get_dummies + pd.DataFrame.dot
    • Tôi sử dụng điều này để khéo léo thực hiện bảng chéo.

Ví dụ

Những gì tôi sẽ làm cho mỗi câu trả lời và câu hỏi tiếp theo là trả lời nó bằng cách sử dụng pd.DataFrame.pivot_table. Sau đó, tôi sẽ cung cấp các lựa chọn thay thế để thực hiện cùng một nhiệm vụ.

Câu 3

Làm thế nào để tôi xoay vòng dfsao cho các colgiá trị là cột, rowgiá trị là chỉ mục, val0giá trị trung bình là các giá trị và giá trị bị thiếu là 0gì?

  • pd.DataFrame.pivot_table

    • fill_valuekhông được đặt theo mặc định. Tôi có xu hướng thiết lập nó một cách thích hợp. Trong trường hợp này tôi đặt nó thành 0. Lưu ý rằng tôi đã bỏ qua câu hỏi 2 vì nó giống như câu trả lời này mà không cófill_value
    • aggfunc='mean'là mặc định và tôi không phải thiết lập nó. Tôi bao gồm nó để được rõ ràng.

      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)

Câu 4

Tôi có thể nhận được một cái gì đó khác hơn mean, như có thể 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)

Câu 5

Tôi có thể làm nhiều hơn một tập hợp tại một thời điểm không?

Lưu ý rằng cho pivot_tablecrosstabtôi cần phải vượt qua danh sách các cuộc gọi. Mặt khác, groupby.aggcó thể lấy chuỗi cho một số lượng hạn chế các chức năng đặc biệt. groupby.aggcũng sẽ sử dụng các tên gọi tương tự mà chúng ta đã chuyển cho người khác, nhưng thường hiệu quả hơn khi tận dụng các tên hàm chuỗi vì có hiệu quả đạt được.

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

Câu 6

Tôi có thể tổng hợp trên nhiều cột giá trị không?

  • pd.DataFrame.pivot_tablechúng tôi vượt qua values=['val0', 'val1']nhưng chúng tôi đã có thể rời bỏ nó hoàn toàn

    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)

Câu 7

Subdivide có thể bằng nhiều cột?

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

Câu 8

Subdivide có thể bằng nhiều cột?

  • 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 bởi vì bộ khóa là duy nhất cho cả hàng và cột

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

Câu 9

Tôi có thể tổng hợp tần suất mà cột và các hàng xuất hiện cùng nhau không, hay còn gọi là "bảng chéo"?

  • 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

Câu 10

Làm cách nào để chuyển đổi DataFrame từ dài sang rộng bằng cách xoay vòng CHỈ trên hai cột?

Bước đầu tiên là gán một số cho mỗi hàng - số này sẽ là chỉ số hàng của giá trị đó trong kết quả xoay vòng. Điều này được thực hiện bằng cách sử dụng 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

Bước thứ hai là sử dụng cột vừa tạo làm chỉ mục để gọi 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

Câu 11

Làm cách nào để làm phẳng nhiều chỉ mục thành một chỉ mục sau pivot

Nếu columnsobjectbằng chuỗijoin

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

khác format

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

43
Bạn có thể vui lòng xem xét việc mở rộng tài liệu chính thức ?
MaxU

Điều gì đã xảy ra với câu trả lời cho Câu hỏi số 10? Tôi nhận được KeyError: 'A'. Có nhiều hơn để trả lời?
Monica Heddneck

@MonicaHeddneck Tôi sẽ xem xét lại và cập nhật nếu cần. Tuy nhiên, 'A'giả sử có một cột 'A'trong khung dữ liệu của bạn để nhóm theo.
piRSquared

Tôi có thể tổng hợp trên nhiều cột giá trị không? câu trả lời cho điều này sẽ làm việc cho các cột có kiểu dữ liệu khác nhau. ví dụ: giá trị = ['val0', 'val1'], ở đây val0 là int và val1 là chuỗi
Anil Kumar

1
không cần thiết phải chèn cột trong câu hỏi 10, nó có thể được truyền trực tiếp dưới dạng đối số trong bảng xoay vòng
ansev

4

Để mở rộng câu trả lời của @ piRSquared phiên bản khác của Câu hỏi 10

Câu 10.1

Khung dữ liệu:

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

Đầu ra:

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

Sử dụng df.groupbypd.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

Hoặc Một sự thay thế tốt hơn nhiều bằng cách sử dụng pd.pivot_tablevớidf.squeeze.

t = df.pivot_table(index='A',values='B',aggfunc=list).squeeze()
out = pd.DataFrame(t.tolist(),index=t.index)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.