Pandas DataFrame 的条件均值

Conditional mean over a Pandas DataFrame

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

我开始于:

data2['socialIdeology2'].mean()

data2['econIdeology'].mean()

^ 完美运行,并给出了我正在寻找的平均值。

现在,我正在尝试计算条件均值,因此仅对数据集中的 select 组求均值。 (我想要在 2016 年选举中按谁投票的意识形态进行分类)在 Stata 中,代码类似于:mean(variable) if voteChoice == 'Clinton'

调查后,我得出结论,条件均值根本不是问题(但愿我是错的?),所以我正在为它编写自己的函数。

这是我刚开始使用 'mean' 函数,为条件均值函数创建基础:

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(我不明白它是怎么回事),为什么 .mean() 函数是否适用?

以及如何按类别获取生成方式?

条件均值确实是 pandas 中的一个东西。您可以使用 DataFrame.groupby():

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

或者,在您的情况下,以下方法可能更有效:

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

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

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

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

如果您想同时获得多个组的方法,那么您可以使用 groupby,如 Brad 的回答。但是,我会这样做:

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

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

有关 groupby 的更多信息,请参阅 here for more info on indexing DataFrames using .loc and here