2017-05-30 25 views
5

Mục tiêu của tôi là đơn giản nhưng không chắc chắn nếu nó có thể. Ví dụ tái sản xuất:Pandas: Groupby để tạo bảng với số lượng và giá trị đếm

Bạn có thể đi từ này:

raw_data = {'score': [1, 3, 4, 4, 1, 2, 2, 4, 4, 2], 
     'player': ['Miller', 'Jacobson', 'Ali', 'George', 'Cooze', 'Wilkinson', 'Lewis', 'Lewis', 'Lewis', 'Jacobson']} 
df = pd.DataFrame(raw_data, columns = ['score', 'player']) 
df 

    score player 
0 1  Miller 
1 3  Jacobson 
2 4  Ali 
3 4  George 
4 1  Cooze 
5 2  Wilkinson 
6 2  Lewis 
7 4  Lewis 
8 4  Lewis 
9 2  Jacobson 

Để này:

 score col_1  col_2  col_3  col_4  
score 
1  2  Miller  Cooze  n/a   n/a 
2  3  Wilkinson Lewis  Jacobson n/a 
3  1  Jacobson n/a   n/a   n/a 
4  4  Ali   George  Lewis  Lewis 

Qua một groupby?

Tôi có thể nhận được điều này đến nay df.groupby(['score']).agg({'score': np.size}) nhưng không thể tìm ra cách tạo cột mới với các giá trị cột.

Trả lời

6

tôi có thể lặp lại kết quả của bạn với

Lựa chọn 1

g = df.groupby('score').player 
g.size().to_frame('score').join(g.apply(list).apply(pd.Series).add_prefix('col_')) 

     score  col_0 col_1  col_2 col_3 
score           
1   2  Miller Cooze  NaN NaN 
2   3 Wilkinson Lewis Jacobson NaN 
3   1 Jacobson  NaN  NaN NaN 
4   4  Ali George  Lewis Lewis 

Lựa chọn 2

d1 = df.groupby('score').agg({'score': 'size', 'player': lambda x: tuple(x)}) 
d1.join(pd.DataFrame(d1.pop('player').values.tolist()).add_prefix('col_')) 

     score  col_0 col_1  col_2 col_3 
score           
1   2  Miller Cooze  NaN NaN 
2   3 Wilkinson Lewis Jacobson NaN 
3   1 Jacobson  NaN  NaN NaN 
4   4  Ali George  Lewis Lewis 
+2

@MaxU tôi sử dụng 'pop'! Tôi rất tự hào về bản thân mình :-) – piRSquared

+0

Cả hai đều tuyệt đẹp. Tôi không nhận được đầu ra chính xác cho tùy chọn 2 (có thể vì tôi đang sử dụng Python 3?). Tuy nhiên, tùy chọn 1 là hoàn hảo. – RDJ

Các vấn đề liên quan