Tính D bằng Grouping trong Pandas
Việc tính toán trên các tập con của một DataFrame là thao tác quá phổ biến nên pandas cung cấp một cách thay thế cho vòng lặp: phương thức groupby. Trong mã mẫu, groupby được dùng trước để nhóm các tract theo bang, tức là những hàng có cùng giá trị ở cột "state". Phương thức sum() được áp dụng theo từng nhóm lên các cột.
Bài tập này cũng sử dụng merge, một phương thức hữu ích khác của pandas, để nối (join) tổng theo nhóm vào từng tract riêng lẻ. Chưa cần lo về cú pháp lúc này. merge sẽ được giải thích ở bài sau.
pandas đã được import với bí danh quen thuộc, và DataFrame tracts chứa các cột dân số white và black đã được nạp. Các biến w và b đã được gán với tên cột "white" và "black".
Bài tập này là một phần của khóa học
Phân tích dữ liệu Điều tra Dân số Hoa Kỳ bằng Python
Hướng dẫn bài tập
- Tạo
sums_by_statebằnggroupbyvà in kết quả. - Tạo
tractsbằngmergevà in kết quả. - Tính \(\left\lvert\frac{a_i}{A} - \frac{b_i}{B}\right\rvert\) và lưu vào cột mới
D. (Lưu ý: Tổng dân số White và Black (\(A\) và \(B\)) đã được tính sẵn và có trong DataFrametractsở các cột có hậu tố"_sum"). - Cộng (sum) cột
Dtheo bang bằng phương thứcgroupby, rồi nhân với0.5.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
# Sum Black and White residents grouped by state
sums_by_state = tracts.groupby("state")[[w, b]].sum()
print(sums_by_state.head())
# Merge the sum with the original tract populations
tracts = pd.merge(tracts, sums_by_state, left_on = "state",
right_index = True, suffixes = ("", "_sum"))
print(tracts.head())
# Calculate inner expression of Index of Dissimilarity formula
tracts["D"] = abs(tracts[____] / tracts[____ + "_sum"] - ____ / ____)
# Calculate the Index of Dissimilarity
print(0.5 * tracts.____(____)["D"].sum())