Làm thế nào để xoay một khung dữ liệu?
- Pivot là gì?
- Làm cách nào để xoay vòng?
- Đây có phải là một trục?
- Định dạng dài đến định dạng rộng?
Tôi đã thấy rất nhiều câu hỏi hỏi về bảng tổng hợp. Ngay cả khi họ không biết rằng họ đang hỏi về bảng tổng hợp, 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 ...
... Nhưng tôi sẽ thử.
Vấn đề với các câu hỏi và câu trả lời hiện có là câu hỏi thường tập trung vào một sắc thái mà OP gặp khó khăn khi 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)
Xem một vài ví dụ từ tìm kiếm trên google của tôi
- Câu hỏi và câu trả lời hay. 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.
- Trong câu hỏi này, OP quan tâm đến sản lượng của trục. Cụ thể là cách 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 lắm cho người dùng gấu trúc.
- 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, pivot
họ sẽ nhận được các kết quả lẻ tẻ có khả năng 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 đã đặt tên rõ ràng 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 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
Tại sao tôi nhận được
ValueError: Index contains duplicate entries, cannot reshape
Làm cách nào để xoay vòng
df
sao chocol
giá trị là cột,row
giá trị là chỉ mục vàval0
giá trị trung bình là 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
Làm cách nào để xoay vòng
df
sao cho cáccol
giá trị là cột,row
giá trị là chỉ số,val0
giá trị trung bình là giá trị và giá trị bị thiếu là0
gì?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
Tôi có thể lấy thứ gì đó khác hơn
mean
, như có thểsum
không?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
Tôi có thể làm nhiều hơn một tập hợp cùng một lúc 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
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
Có thể Chia nhỏ cho nhiều cột không?
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
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
Tôi có thể tổng hợp tần suất mà cột và hàng xuất hiện cùng nhau, hay còn gọi là "lập bảng chéo" không?
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
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
Làm cách nào để san bằ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
Trả lời
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 vì gấu trúc đang cố lập chỉ mục lại một columns
hoặc một index
đối tượng có các mục nhập trùng lặp. Có nhiều phương pháp khác nhau để sử dụng có thể thực hiện xoay. Một số trong số chúng không phù hợp khi có bản sao của các khóa mà nó đang được yêu cầu xoay. Ví dụ. Hãy cân nhắc pd.DataFrame.pivot
. Tôi biết có những mục trùng lặp chia sẻ các giá trị row
và col
:
df.duplicated(['row', 'col']).any()
True
Vì vậy, khi tôi pivot
sử dụng
df.pivot(index='row', columns='col', values='val0')
Tôi nhận được lỗi được đề cập ở trên. Trên thực tế, tôi gặp phải lỗi tương tự khi cố gắng thực hiện cùng một tác vụ với:
df.set_index(['row', 'col'])['val0'].unstack()
Đây là danh sách các thành ngữ chúng ta có thể sử dụng để xoay
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 xoay nào
- Bạn chỉ định tất cả các cột sẽ tạo thành cấp hàng xoay vòng và cấp cột trong một nhóm bằng. 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 có
unstack
các cấp độ mà bạn muốn có trong chỉ mục cột.
pd.DataFrame.pivot_table
- Một phiên bản được tôn vinh
groupby
với API trực quan hơn. Đối với nhiều người, đây là cách tiếp cận ư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.
- Một phiên bản được tôn vinh
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ư
groupby
mô hình, chúng tôi chỉ định tất cả các cột cuối cùng sẽ là cấp độ hàng hoặc cột và đặt chúng làm chỉ mục. Sau đóunstack
, chúng tôi đưa ra các mức chúng tôi muốn trong các cột. Nếu mức chỉ mục còn lại hoặc mức cột không phải là duy nhất, phương pháp này sẽ thất bại.
pd.DataFrame.pivot
- Rất giống
set_index
ở chỗ nó chia sẻ giới hạn về khóa trùng lặp. API cũng rất hạn chế. Nó chỉ mất giá trị vô hướng choindex
,columns
,values
. - Tương tự như
pivot_table
phương pháp chúng ta chọn hàng, cột và giá trị để xoay. 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 pháp này sẽ thất bại.
- Rất giống
pd.crosstab
- Đây là một phiên bản chuyên biệt
pivot_table
và ở dạng thuần túy nhất là cách trực quan nhất để thực hiện một số tác vụ.
- Đây là một phiên bản chuyên biệt
pd.factorize
+np.bincount
- Đây là một kỹ thuật cao cấp, rất ít người biết đến nhưng rất nhanh chóng. 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 thành quả.
pd.get_dummies
+pd.DataFrame.dot
- Tôi sử dụng điều này để thực hiện khéo léo các 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 hỏi 3
Làm cách nào để xoay vòng
df
sao cho cáccol
giá trị là cột,row
giá trị là chỉ số,val0
giá trị trung bình là giá trị và giá trị bị thiếu là0
gì?
pd.DataFrame.pivot_table
fill_value
khô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ành0
. Lưu ý rằng tôi đã bỏ qua câu hỏi 2 vì nó giống với 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 đặt nó. Tôi đã bao gồm nó để 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 hỏi 4
Tôi có thể lấy thứ gì đó khác hơn
mean
, như có thểsum
không?
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 hỏi 5
Tôi có thể làm nhiều hơn một tập hợp cùng một lúc không?
Lưu ý rằng đối với pivot_table
và crosstab
tôi cần phải chuyển danh sách có thể gọi. Mặt khác, groupby.agg
có thể lấy chuỗi cho một số chức năng đặc biệt hạn chế. groupby.agg
cũng sẽ sử dụng các hàm gọi tương tự mà chúng tôi đã chuyển cho những 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 hỏi 6
Tôi có thể tổng hợp trên nhiều cột giá trị không?
pd.DataFrame.pivot_table
chúng tôi vượt quavalues=['val0', 'val1']
nhưng chúng tôi có thể bỏ điều đó hoàn toàndf.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 hỏi 7
Có thể Chia nhỏ cho nhiều cột không?
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 hỏi 8
Có thể Chia nhỏ cho nhiều cột không?
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
vì bộ khóa là duy nhất cho cả hàng và cộtdf.set_index( ['key', 'row', 'item', 'col'] )['val0'].unstack(['item', 'col']).fillna(0).sort_index(1)
Câu hỏi 9
Tôi có thể tổng hợp tần suất mà cột và hàng xuất hiện cùng nhau, hay còn gọi là "lập bảng chéo" không?
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 mới 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 để san bằng nhiều chỉ mục thành một chỉ mục sau
pivot
Nếu columns
nhập object
bằng chuỗijoin
df.columns = df.columns.map('|'.join)
khác format
df.columns = df.columns.map('{0[0]}|{0[1]}'.format)
Để mở rộng câu trả lời của @ piRSquared một 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.groupby
và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
Hoặc A tốt hơn thay thế sử dụng pd.pivot_table
vớidf.squeeze.
t = df.pivot_table(index='A',values='B',aggfunc=list).squeeze()
out = pd.DataFrame(t.tolist(),index=t.index)