私が作成した複数の変数のいくつかの平均が必要なデータセットがあります。
私は始めました:
_data2['socialIdeology2'].mean()
data2['econIdeology'].mean()
_
^それは完璧に機能し、私が探している平均を与えてくれます。
今、私は条件付き平均を実行しようとしているので、データセット内の選択したグループのみの平均です。 (私は2016年の選挙で投票した人によって破壊されたイデオロギーを求めています)スタタでは、コードは次のようになります:mean(variable) if voteChoice == 'Clinton'
調べてみたところ、条件付き平均はまったく問題ではない(うまくいけば私は間違っているのではないでしょうか)という結論に達したので、そのための独自の関数を作成していました。
これは、条件付き平均関数の基礎を作成するための「平均」関数から始めたばかりです。
_def mean():
sum = 0.0
count = 0
for index in range(0, len(data2['socialIdeology2'])):
sum = sum + (data2['socialIdeology2'][index])
print(data2['socialIdeology2'][index])
count = count + 1
return sum / count
print(mean())
_
それでも結果として「ナン」が出続けます。ループ内で_data2['socialIdeology2'][index]
_を印刷すると、nan
が繰り返し印刷されます。
だから私の質問は:_socialIdeology2
_変数に格納されたデータが実際にnan
(それがどのようになっているのかわからない)である場合、なぜ.mean()
関数はそれで動作しますか?
そして、どのようにしてカテゴリごとに平均を生成できますか?
条件付きの平均は、確かにパンダの物です。 DataFrame.groupby()
を使用できます:
means = data2.groupby('voteChoice').mean()
または、おそらく、あなたの場合、次の方がより効率的です:
means = data2.groupby('voteChoice')['socialIdeology2'].mean()
あなたが探している平均までドリルダウンします。 (最初のケースでは、すべての列の平均を計算します。)これは、voteChoice
が条件付けする列の名前であると想定しています。
singleグループ(例:Clinton有権者)の平均のみに関心がある場合は、そのグループのメンバーに対してTrueであるブールシリーズを作成し、これを使用して平均を取る前に、DataFrameの行にインデックスを付けます。
_voted_for_clinton = data2['voteChoice'] == 'Clinton'
mean_for_clinton_voters = data2.loc[voted_for_clinton, 'socialIdeology2'].mean()
_
複数のグループの手段を同時に取得したい場合は、Bradの回答のようにgroupby
を使用できます。しかし、私はこのようにします:
_means_by_vote_choice = data2.groupby('voteChoice')['socialIdeology2'].mean()
_
_['socialIdeology2']
_インデックスを.mean()
の前に配置することは、関心のある列の平均のみを計算することを意味しますが、インデックス式を.mean()
の後に配置するとすなわちdata2.groupby('voteChoice').mean()['socialIdeology2']
)all列の平均を計算し、結果から_'socialIdeology2'
_列のみを選択します。これは効率が低下します。
_.loc
_を使用したDataFrameのインデックス作成の詳細については here を、groupby
の詳細については here を参照してください。