2016-09-22 31 views
5

Tôi có khung dữ liệu gấu trúc với biến danh mục và một số biến số. Một cái gì đó như thế này:Làm cách nào để chuyển đổi các dòng dữ liệu pandas thành các cột, dựa trên danh mục?

ls = [{'count':5, 'module':'payroll', 'id':2}, {'count': 53, 'module': 'general','id':2}, {'id': 5,'count': 35, 'module': 'tax'}, ] 
df = pd.DataFrame.from_dict(ls) 

Các df trông như thế này:

df 
Out[15]: 
    count id module 
0  5 2 payroll 
1  53 2 general 
2  35 5  tax 

Tôi muốn chuyển đổi (transpose là từ đúng không?) Các biến mô-đun vào cột và nhóm của id. Vì vậy, một cái gì đó như:

general_count id payroll_count tax_count 
0   53.0 2   5.0  NaN 
1   NaN 5   NaN  35.0 

Một cách tiếp cận này sẽ được sử dụng áp dụng:

df['payroll_count'] = df.id.apply(lambda x: df[df.id==x][df.module=='payroll']) 

Tuy nhiên, điều này phải chịu đựng từ nhiều nhược điểm:

  1. đắt, và phải mất quá nhiều thời gian

  2. Tạo hiện vật và trống các khung dữ liệu t mũ cần phải được làm sạch.

Tôi cảm thấy có cách tốt hơn để đạt được điều này với pandas groupby, nhưng không thể tìm được cách thức để hoạt động tương tự này hiệu quả hơn. Hãy giúp tôi.

+0

Trong đầu ra mong muốn của bạn , 'id' trong hàng đầu tiên phải là 2, phải không? – IanS

+0

Đúng. cố định nó .. Cảm ơn đã chỉ ra .. @ jezrael đã đưa ra một câu trả lời tốt đẹp quá. –

Trả lời

5

Bạn có thể sử dụng groupby theo các cột đầu tiên tạo mới indexcolumn mới nhất. sau đó cần aggreagate một số cách - tôi sử dụng mean, sau đó chuyển đổi một cột DataFrame thành Series bởi DataFrame.squeeze (sau đó không cần phải loại bỏ cấp cao nhất của Multiindex trong cột) và định lại bằng unstack. Bài add_suffix tên cột:

df = df.groupby(['id','module']).mean().squeeze().unstack().add_suffix('_count') 
print (df) 
module general_count payroll_count tax_count 
id            
2    53.0   5.0  NaN 
5     NaN   NaN  35.0 

Một giải pháp với pivot, sau đó cần phải loại bỏ Multiindex từ cột bằng list comprehension:

df = df.pivot(index='id', columns='module') 
df.columns = ['_'.join((col[1], col[0])) for col in df.columns] 
print (df) 
    general_count payroll_count tax_count 
id           
2   53.0   5.0  NaN 
5    NaN   NaN  35.0 
+0

Thanks .. The groupby là giải pháp phù hợp với hoàn cảnh của tôi một cách hoàn hảo. Trục xoay có thể gây ra sự cố khi tôi cố gắng nhóm dữ liệu. Một chút giải thích về cách nhóm đó sẽ hữu ích cho người khác. –

+0

Ok, hãy cho tôi như ec – jezrael

0

Bạn có thể sử dụng set_indexunstack

In [2]: df.set_index(['id','module'])['count'].unstack().add_suffix('_count').reset_index() 
Out[2]: 
module id general_count payroll_count tax_count 
0  2   53.0   5.0  NaN 
1  5   NaN   NaN  35.0 
Các vấn đề liên quan