【问题标题】:Using a for loop to create additional columns that calculate percentages based on multiple conditions使用 for 循环创建基于多个条件计算百分比的附加列
【发布时间】:2020-12-25 16:52:59
【问题描述】:

我有一个包含调查数据的数据框。调查数据评估了多个因素,例如教练、多样性、参与度等。还有其他几个列可以捕获人口统计数据(例如,年龄、部门等)。我想根据包含评级的列添加列。

添加这些列的目的是 a) 提供正面回应的计数,b) 获得正面回应的百分比(正面回应的数量/该因素中的项目数量)和 c) 获得正面回应的百分比因子级别的有利响应(条件是如果任何项目缺少响应,则在因子级别它将为 NULL)

下表显示了仅包含指导项的所需输出。该表应包含其他评分列,并应适用于多样性、领导力、敬业度等因素。

Coach_q1     Coach_q2    Coach_q3      coach_fav_count  coach_fav_perc  coach_agg_perc 
Favourable   Neutral     Favourable    2                66%            66%        
Favourable   Favourable  Fabourable    3                100%           100%
NaN          Favourable  NaN           1                33%            NaN
Favourable   NaN         Favourable    2                66%            NaN         

以下代码用于获取 _favcount 列和 _fav% 列。 ratingcollist 用于仅对具有这些前缀的列应用转换。但是,我无法获得旨在获得整个因素的有利响应百分比的因素水平列 - 仅当针对该特定因素的所有问题都已回答时(即,如果在特定因素中的任何项目中缺少响应因子,那么该因子将产生一个 NaN 值)。

感谢任何形式的帮助,谢谢。

ratingcollist = ['Coach_','Diversity_','Leadership_','Engagement_']


#create a for loop to get all the columns that match the column list keyword
for rat in ratingcollist:
    cols = df.filter(like=rat).columns

#create 2 new columns for each factor, one for count of Favourable responses and one for percentage of Favourable responses
    if len(cols) > 0:
        df[f'{rat.lower()}fav_count'] = (df[cols] == 'Favourable').sum(axis=1)
        df[f'{rat.lower()}fav_perc'] = (df[f'{rat.lower()}fav_count'] / len(cols)) * 100

【问题讨论】:

    标签: python-3.x pandas numpy dataframe for-loop


    【解决方案1】:

    如果DataFrame.notnaDataFrame.all 没有丢失所有值,您可以添加掩码进行测试,并且仅针对DataFrame.loc 中的此添加百分比列:

    df = pd.DataFrame({'Coach_q1': ['Favourable', 'Favourable', np.nan, 'Favourable'], 'Coach_q2': ['Neutral', 'Favourable', 'Favourable', np.nan], 'Coach_q3': ['Favourable', 'Favourable', np.nan, 'Favourable']})
    

    ratingcollist = ['Coach_','Diversity_','Leadership_','Engagement_']
    
    
    #create a for loop to get all the columns that match the column list keyword
    for rat in ratingcollist:
        cols = df.filter(like=rat).columns
        
        mask = df[cols].notna().all(axis=1)
    
    #create 2 new columns for each factor, one for count 
    #of Favourable responses and one for percentage of Favourable responses
        if len(cols) > 0:
            df[f'{rat.lower()}fav_count'] = (df[cols] == 'Favourable').sum(axis=1)
            df[f'{rat.lower()}fav_perc'] = (df.loc[mask, f'{rat.lower()}fav_count'] / len(cols)) * 100
    
    print (df)
         Coach_q1    Coach_q2    Coach_q3  coach_fav_count  coach_fav_perc
    0  Favourable     Neutral  Favourable                2       66.666667
    1  Favourable  Favourable  Favourable                3      100.000000
    2         NaN  Favourable         NaN                1             NaN
    3  Favourable         NaN  Favourable                2             NaN
    

    【讨论】:

    • 嗨@jezrael,转换似乎不起作用。我得到了与 fav_perc 列相似的值
    • @wjie08 - 很奇怪,在样本数据中运行良好。
    • 我似乎找不到创建 _factor_agg% 列的代码,是不是我遗漏了什么?
    • @wjie08 - 我认为是coaching_fav_percdiversity_fav_perc
    • 我明白了,但代码似乎没有创建 coaching_factor_agg% 列我使用了以下代码但不起作用:df[f'{rat.lower()}agg_perc'] = (df.loc[mask,f'{rat.lower()}fav_count'] / len(cols)) * 100
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多