在 Pandas 中用分組計算 D
對 DataFrame 的子集合進行計算非常常見,因此 pandas 提供了迴圈以外的替代作法:groupby 方法。在範例程式碼中,groupby 先依州別將 tract 分組,也就是把 "state" 欄位值相同的列分到同一組。接著對各組的欄位套用 sum() 方法,做出「逐組彙總」。
這個練習也會用到 merge,這是另一個實用的 pandas 方法,用來把分組後的總和與各個 tract 連接起來。現在先不用擔心語法;merge 會在之後的課程再詳細說明。
pandas 已用一般慣用的別名匯入,且已載入含有人口欄位 white 與 black 的 tracts DataFrame。變數 w 與 b 也已分別定義為欄位名稱 "white" 與 "black"。
本練習屬於課程
使用 Python 分析美國 Census 資料
練習說明
- 使用
groupby建立sums_by_state,並印出結果。 - 使用
merge建立tracts,並印出結果。 - 計算 $\left\lvert\frac{a_i}{A} - \frac{b_i}{B}\right\rvert$,並儲存在新欄位
D中。(提醒:White 與 Black 的總人口(\(A\) 與 $B$)已經計算好,位於tractsDataFrame 中,欄位尾碼為"_sum"。) - 使用
groupby方法依州別彙總欄位D,並乘上0.5。
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
# 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())