Pandasでグループ化してDを計算する
DataFrameを部分集合ごとに計算するのはとても一般的なので、pandasにはループの代わりとなるgroupbyメソッドがあります。サンプルコードでは、まずgroupbyを使って州ごと、つまり"state"列の値が同じ行ごとにトラクトをグループ化しています。続いて、列に対してグループ単位でsum()メソッドを適用します。
この演習ではさらに、もう一つ便利なpandasメソッドであるmergeを使って、グループ化して合計した値を各トラクトに結合しています。今は文法を気にしなくて大丈夫です。mergeは後のレッスンで解説します。
pandasは通常のエイリアスでインポート済みで、人口の列whiteとblackを持つDataFrame tractsが読み込まれています。変数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$)はすでに計算済みで、"_sum"というサフィックスの付いた列としてtractsDataFrameに入っています。) 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())