在 Pandas 中使用分组计算 D
对 DataFrame 的子集执行计算非常常见,因此 pandas 提供了无需使用循环的替代方式:groupby 方法。在示例代码中,先用 groupby 按州分组街区(tract),也就是按 "state" 列中相同取值将行归为一组。随后对各列按组应用 sum() 方法。
本练习还用到了 merge,这是另一个很有用的 pandas 方法,用于将分组求和的结果与各个街区行进行连接。现在先不必担心其语法,merge 会在后续课程中讲解。
pandas 已按常用别名导入,包含人口列 white 和 black 的 tracts DataFrame 已加载。变量 w 和 b 分别被定义为列名 "white" 和 "black"。
本练习是课程的一部分
使用 Python 分析美国人口普查数据
练习说明
- 使用
groupby创建sums_by_state并打印结果。 - 使用
merge创建tracts并打印结果。 - 计算 $\left\lvert\frac{a_i}{A} - \frac{b_i}{B}\right\rvert$,并将其存入新列
D。(提醒:白人和黑人总人口数(\(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())