web-dev-qa-db-ja.com

Pandas DataFrameの条件付き平均

私が作成した複数の変数のいくつかの平均が必要なデータセットがあります。

私は始めました:

_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()関数はそれで動作しますか?

そして、どのようにしてカテゴリごとに平均を生成できますか?

6
Oliver G

条件付きの平均は、確かにパンダの物です。 DataFrame.groupby() を使用できます:

means = data2.groupby('voteChoice').mean()

または、おそらく、あなたの場合、次の方がより効率的です:

means = data2.groupby('voteChoice')['socialIdeology2'].mean()

あなたが探している平均までドリルダウンします。 (最初のケースでは、すべての列の平均を計算します。)これは、voteChoiceが条件付けする列の名前であると想定しています。

8
Brad Solomon

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 を参照してください。

1
ali_m