如何利用字典计算数据框中的多个平均值

Posted

技术标签:

【中文标题】如何利用字典计算数据框中的多个平均值【英文标题】:How to make use of Dictionary to count multiple Average values from dataframe 【发布时间】:2020-08-18 07:35:48 【问题描述】:

我在 csv 文件中有 3 列。 “Pclass”、“性别”、“年龄”。 Pclass 具有 3 个分类值:1、2 和 3。Sex 具有值“男性”和“女性”,Age 具有从 0 到 75 的值。 现在,我想根据 pclass 和性别计算六个不同的平均年龄。所以会有6个平均值。 (1-男性) (2-男) (3-男性) (1-女性) (2-女) (3-女)

我制作了以下程序。但我想知道是否可以使用字典来做同样的事情.. dict = 键将我 m1,m2 等等...并以某种方式将键的值替换为平均值。

dataset = pd.read_csv('train.csv')
prediction_set = pd.read_csv('test.csv')

dataset.isnull().sum()
prediction_set.isnull().sum()
 
'''Dealing with Missing Age'''
# we are going to catogorise age by Pclass and Sex

m1 = m2 = m3 = f1 = f2 = f3 = 0
count_m1 = count_m2 = count_m3 = count_f1 = count_f2 = count_f3 = 0

for i in range(0,891):
    if np.isnull(dataset['Age'][i]
        continue
    if dataset['Pclass'][i]==1:
        if dataset['Sex'][i]=='male':
            m1 = m1 + dataset['Age'][i]
            count_m1 = count_m1 + 1
    if dataset['Pclass'][i]==2:
        if dataset['Sex'][i]=='male':
            m2 = m2 + dataset['Age'][i]
            count_m2 = count_m2 + 1                    
    if dataset['Pclass'][i]==3:
        if dataset['Sex'][i]=='male':
            m3 = m3 + dataset['Age'][i]
            count_m3 = count_m3 + 1
    if dataset['Pclass'][i]==1:
        if dataset['Sex'][i]=='female':
            f1 = f1 + dataset['Age'][i]
            count_f1 = count_f1 + 1
    if dataset['Pclass'][i]==2:
        if dataset['Sex'][i]=='female':
            f2 = f2 + dataset['Age'][i]
            count_f2 = count_f2 + 1
    if dataset['Pclass'][i]==3:
        if dataset['Sex'][i]=='female':
            f3 = f3 + dataset['Age'][i]
            count_f3 = count_f3 + 1

m1 = m1/count_m1
m2 = m2/count_m2
m3 = m3/count_m3
f1 = f1/count_f1
f2 = f2/count_f2
f3 = f3/count_f3

print('m1 = ', m1)
print('m2 = ', m2)
print('m3 = ', m3)
print('f1 = ', f1)
print('f2 = ', f2)
print('f3 = ', f3)

请告诉我其中有什么问题。

【问题讨论】:

你能在问题中提供dataset.to_string()prediction_set.to_string()吗? 问题是“年龄”列中有一些空值,因此导致了问题。我用一个额外的'if'语句纠正了它。但现在我想知道你是否可以使用字典来做同样的事情。请指教。谢谢 你能在问题中提供 dataset.to_string() 和 prediction_set.to_string() 吗? 【参考方案1】:

要获得 6 组的平均年龄(3 个 pclass 类别 x 2 个性别类别),可以尝试使用:

dataset.groupby(['Pclass', 'Sex'])['Age'].mean()

希望我没有误解您的问题。

【讨论】:

天啊...你是不是把我的 7500 行代码减少到了 1 行?你是谁..lol. 无论如何.. 我现在如何在变量中获取这 6 个值?它会返回我可以分配给的东西吗? 如果我们将输出分配给一个名为 mean 的变量,如下所示:mean = dataset.groupby(['Pclass', 'Sex'])[['Age']].mean() (请请注意,这个年龄有双括号)。要访问平均分数,可以尝试以下任一方法:1) mean.query("Pclass==1 & Sex=='female'").values 或 2) mean = mean.to_dict()['age'] 和然后表示[(1, 'female')] 我试过了,但出错了……有什么问题,你怎样才能使它紧凑?对于范围内的 i(0,891):如果 pd.isnull(数据集 ['Age'][i]):如果数据集 ['Pclass'][i]==1:如果数据集 ['Sex'][i]== 'male': 数据集['Age'][i]=means.query("Pclass== 2 & Sex == 'male'").values if dataset['Pclass'][i]==2: if dataset ['Sex'][i]=='male': dataset['Age'][i]=means.query("Pclass== 2 & Sex == 'male'").values 等等...对于每组 Pclass & Sex for c in df['Pclass'].unique(): for s in df['Sex'].unique(): df.loc[(df['Pclass']==c ) & (df['Sex']==s) & df['Age'].isna(), 'age'] = mean.query("Pclass==@c & Sex==@s").values [0][0]

以上是关于如何利用字典计算数据框中的多个平均值的主要内容,如果未能解决你的问题,请参考以下文章

通过数据框中的一个参数计算具有平均值的新行[重复]

编写一个 R 脚本来计算数据框中的平均值

Pandas:交换一个数据框中的特定列值并计算其加权平均值

在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”

如何从R中的数据框中删除负值

计算 Pandas 数据框中的平均真实范围列 [重复]