Pandas DataFrame的条件均值

时间:2017-06-27 19:01:19

标签: python pandas mean nan

我有一个数据集,我想从中创建一些我创建的多个变量的平均值。

我开始时:

data2['socialIdeology2'].mean()

data2['econIdeology'].mean()

^完美无缺,给了我正在寻找的平均值。

现在,我正在尝试进行条件均值,因此仅对数据集中的选择组进行均值。 (我想要在2016年选举中投票选出的意识形态细分)在Stata中,代码类似于: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())

然而,我不断得到'nan'作为结果。在循环中打印data2['socialIdeology2'][index]一遍又一遍地打印nan

所以我的问题是:如果socialIdeology2变量中存储的数据确实是nan(我不明白它是怎么回事),那为什么{{1}函数可以用吗?

我怎样才能按类别获得生成方式?

2 个答案:

答案 0 :(得分:6)

有条件的意思确实是熊猫的事情。您可以使用DataFrame.groupby()

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

或者,在您的情况下,以下内容会更有效:

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

深入了解您正在寻找的意思。 (第一种情况将计算所有列的均值。)这假设voteChoice是您要条件的列的名称。

答案 1 :(得分:1)

如果您只对组(例如克林顿选民)的意思感兴趣,那么您可以为该组的成员创建一个True的布尔系列,然后使用它来在取平均值之前索引到DataFrame的行:

voted_for_clinton = data2['voteChoice'] == 'Clinton'
mean_for_clinton_voters = data2.loc[voted_for_clinton, 'socialIdeology2'].mean()

如果您想同时获得多个群组的资助,那么您可以使用groupby,就像布拉德的回答一样。但是,我会这样做:

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

['socialIdeology2']之前放置.mean()索引意味着您只计算您感兴趣的列的平均值,而如果您将索引表达式放在.mean()之后(即data2.groupby('voteChoice').mean()['socialIdeology2'])这会计算所有列的均值,然后仅从结果中选择'socialIdeology2'列,效率较低。

有关使用.lochere索引DataFrames的更多信息,请参阅here,了解有关groupby的更多信息。