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。
我有一个数据集,我想从中获取我创建的多个变量的一些平均值。
我开始于:
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。