关于Pandas数据透视表的不同问题

vltsax25  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(146)

下面是我的df:

df=pd.DataFrame(
    {
        'Color': ['red','blue','red','red','green','red','yellow'],
        'Type': ['Oil', 'Aluminium', 'Oil', 'Oil', 'Cement Paint', 'Synthetic Rubber', 'Emulsion'],
        'Finish' : ['Satin', 'Matte', 'Matte', 'Satin', 'Semi-gloss', 'Satin', 'Satin'],
        'Use' : ['Interior', 'Exterior', 'Interior', 'Interior', 'Exterior', 'Exterior', 'Exterior'],
        'Price' : [55, 75, 60, 60, 55, 75, 50]
    }
)

我想创建一个数据透视表,该数据透视表将输出“颜色”、“颜色计数”、颜色的百分比或权重或每种计数,最后是一个总计行,在100%旁边输出总颜色计数。此外,我想添加一个标题,标题中包含今天的日期,格式如下(02 - 11月)。
这是我当前的轴,输入是近似值

today=datetime.date.today()
today_format=today.strftime("%d-m%")

pivot_table=pd.pivot_table(
    data=df,
    index='Color',
    aggfunc={'Color':'count'}
)

df['Color'].value_counts(
    normalize=True
).mul(100).round(1).astype(str) + '%'

有没有办法将更多的信息添加到透视表中作为标题、总计和额外的列?或者我只是尝试将透视表转换回DF并从那里编辑它?
我发现的主要困难是,由于我处理的是字符串数据,当我'aggfunc =' sum '时,它实际上将字符串相加。如果我尝试添加'margins=True,margins_name ='Total count',我会得到以下错误:

if isinstance(aggfunc[k], str):
KeyError: 'Type'

所需的表输出如下所示:

t9eec4r0

t9eec4r01#

更新的答案

感谢Rabinzel的一个很好的建议,我们还可以将今天的日期作为列标题:

df = (df['Color'].value_counts().reset_index().pivot_table(index = ['index'], aggfunc = np.sum, margins=True, margins_name='Total')
 .assign(perc = lambda x: x['Color']/x.iloc[:-1]['Color'].sum() * 100)
 .rename(columns = {'Color' : 'Color Count', 
                    'perc' : '%'}))

new_cols = pd.MultiIndex.from_product([[datetime.today().strftime('%#d-%b')], df.columns])
df.columns = new_cols
df

             2-Nov            
       Color Count           %
index                         
blue             1   14.285714
green            1   14.285714
red              4   57.142857
yellow           1   14.285714
Total            7  100.000000

相关问题