将“合计百分比”列添加到Pandas pivot_选项卡

2024-10-01 09:39:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我似乎不知道如何将每个date_submitted组的%列添加到下面的pandas pivot表中:

In [177]: pass_rate_pivot

date_submitted  audit_status
04-11-2014      audited         140
                is_adserver       7
                rejected         75
                unauditable     257
04-18-2014      audited         177
                is_adserver      10
                pending          44
                rejected         30
                unauditable     226
04-25-2014      audited          97
                is_adserver       5
                pending          33
                rejected          9
                unauditable     355
Name: site_domain, dtype: int64

In [177]: pass_rate_pivot.to_dict()


Out[177]:
{('04-11-2014', 'audited'): 140,
 ('04-11-2014', 'is_adserver'): 7,
 ('04-11-2014', 'rejected'): 75,
 ('04-11-2014', 'unauditable'): 257,
 ('04-18-2014', 'audited'): 177,
 ('04-18-2014', 'is_adserver'): 10,
 ('04-18-2014', 'pending'): 44,
 ('04-18-2014', 'rejected'): 30,
 ('04-18-2014', 'unauditable'): 226,
 ('04-25-2014', 'audited'): 97,
 ('04-25-2014', 'is_adserver'): 5,
 ('04-25-2014', 'pending'): 33,
 ('04-25-2014', 'rejected'): 9,
 ('04-25-2014', 'unauditable'): 355}

Tags: inpandasdaterateisstatuspassaudit
2条回答

最自然的方法是在创建透视表时执行此操作。这里我假设date_submitted是一个使用reset_index的列(不在索引中)。确保你的值在一列中(这里我称之为“值列”)。那么

def calc_group_pct(df,value_var = 'value_col'):
    df['pct'] = df[value_var]/float(df[value_var].sum())
    return df
df.groupby('date_submitted').apply(calc_group_pct)

这是你想要的吗?(对于每个将元素除以该组中所有元素之和的组):

In [62]: pass_rate_pivot.groupby(level=0).transform(lambda x: x/x.sum())
Out[62]: 
04-11-2014  audited        0.292276
            is_adserver    0.014614
            rejected       0.156576
            unauditable    0.536534
04-18-2014  audited        0.363450
            is_adserver    0.020534
            pending        0.090349
            rejected       0.061602
            unauditable    0.464066
04-25-2014  audited        0.194389
            is_adserver    0.010020
            pending        0.066132
            rejected       0.018036
            unauditable    0.711423
dtype: float64

如果您想将其作为列添加,您确实可以按照@exp1orer的建议将这两个系列都添加到一个数据帧中:

^{pr2}$

如果pass_rate_pivot已经是一个数据帧,那么您只需分配一个新的列,比如pass_rate_pivot['pct'] = pass_rate_pivot['original column'].groupby(...

相关问题 更多 >