始める無料で始める

Pandasでグループ化してDを計算する

DataFrameを部分集合ごとに計算するのはとても一般的なので、pandasにはループの代わりとなるgroupbyメソッドがあります。サンプルコードでは、まずgroupbyを使って州ごと、つまり"state"列の値が同じ行ごとにトラクトをグループ化しています。続いて、列に対してグループ単位でsum()メソッドを適用します。

この演習ではさらに、もう一つ便利なpandasメソッドであるmergeを使って、グループ化して合計した値を各トラクトに結合しています。今は文法を気にしなくて大丈夫です。mergeは後のレッスンで解説します。

pandasは通常のエイリアスでインポート済みで、人口の列whiteblackを持つDataFrame tractsが読み込まれています。変数wbには、それぞれ列名の"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"というサフィックスの付いた列としてtracts DataFrameに入っています。)
  • 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())
コードを編集して実行