Vấn đề của tôi là cách tính tần số trên nhiều biến trong gấu trúc. Tôi có từ dataframe này:Bảng tần số trong gấu trúc (như plyr trong R)
d1 = pd.DataFrame({'StudentID': ["x1", "x10", "x2","x3", "x4", "x5", "x6", "x7", "x8", "x9"],
'StudentGender' : ['F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'M'],
'ExamenYear': ['2007','2007','2007','2008','2008','2008','2008','2009','2009','2009'],
'Exam': ['algebra', 'stats', 'bio', 'algebra', 'algebra', 'stats', 'stats', 'algebra', 'bio', 'bio'],
'Participated': ['no','yes','yes','yes','no','yes','yes','yes','yes','yes'],
'Passed': ['no','yes','yes','yes','no','yes','yes','yes','no','yes']},
columns = ['StudentID', 'StudentGender', 'ExamenYear', 'Exam', 'Participated', 'Passed'])
Để kết quả sau
Participated OfWhichpassed
ExamenYear
2007 3 2
2008 4 3
2009 3 2
(1) Một khả năng tôi đã cố gắng là để tính toán hai dataframe và ràng buộc họ
t1 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Participated'], aggfunc = len)
t2 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Passed'], aggfunc = len)
tx = pd.concat([t1, t2] , axis = 1)
Res1 = tx['yes']
(2) Khả năng thứ hai là sử dụng một hàm tổng hợp.
import collections
dg = d1.groupby('ExamenYear')
Res2 = dg.agg({'Participated': len,'Passed': lambda x : collections.Counter(x == 'yes')[True]})
Res2.columns = ['Participated', 'OfWhichpassed']
Cả hai cách rất khó để nói điều ít nhất. Cách này được thực hiện đúng cách trong gấu trúc?
PS: Tôi cũng đã cố gắng value_counts thay vì collections.Counter nhưng không thể làm cho nó làm việc
Để tham khảo: Vài tháng trước, tôi hỏi câu hỏi tương tự cho R here và plyr thể giúp
---- CẬP NHẬT ------
dùng DSM là đúng. đã xảy ra lỗi trong kết quả bảng mong muốn.
(1) Các mã cho lựa chọn một là
t1 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], aggfunc = len)
t2 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Participated'], aggfunc = len)
t3 = d1.pivot_table(values = 'StudentID', rows=['ExamenYear'], cols = ['Passed'], aggfunc = len)
Res1 = pd.DataFrame({'All': t1,
'OfWhichParticipated': t2['yes'],
'OfWhichPassed': t3['yes']})
Nó sẽ tạo ra kết quả
All OfWhichParticipated OfWhichPassed
ExamenYear
2007 3 2 2
2008 4 3 3
2009 3 3 2
(2) Đối với Lựa chọn 2, nhờ sử dụng herrfz, tôi đã tìm ra cách để sử dụng value_count và mã sẽ là
Res2 = d1.groupby('ExamenYear').agg({'StudentID': len,
'Participated': lambda x: x.value_counts()['yes'],
'Passed': lambda x: x.value_counts()['yes']})
Res2.columns = ['All', 'OfWgichParticipated', 'OfWhichPassed']
sẽ tạo thứ e cùng kết quả như Res1
Câu hỏi của tôi vẫn còn mặc dù: (? cho các hoạt động khác)
Sử dụng Lựa chọn 2, nó sẽ có thể sử dụng các biến tương tự hai lần người ta có thể vượt qua một tên tùy chỉnh cho biến kết quả?
---- Một CẬP NHẬT MỚI ----
tôi cuối cùng đã quyết định sử dụng áp dụng mà tôi hiểu là linh hoạt hơn.
Tôi không chắc tôi hiểu đầu ra của bạn. Nhìn vào năm 2007, dường như có hai sinh viên đã tham gia = có, nhưng kết quả mong muốn của bạn có "3" - tức là tất cả sinh viên năm 2007. Vì vậy, bạn có muốn các giá trị của cột Tham gia mới được tính không? – DSM
.. thực sự, 'Res1' và' Res2' của bạn không đồng ý về điều này, vì vậy tôi không chắc bạn đã quyết định hay chưa. – DSM
bạn đúng: ý tôi là với 'Tham gia' thực sự là chiều dài của DataFrame (và không tham gia == có). Không sao, tôi nghĩ giải pháp thứ hai có vẻ hứa hẹn hơn – user1043144