我有一个数据集,我想从中创建一些我创建的多个变量的平均值。
我开始时:
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}函数可以用吗?
我怎样才能按类别获得生成方式?
答案 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'
列,效率较低。