熊猫数据透视表中行/列的百分比

假设我有数据框df:


df.head()

                     M1       M2      M3       M4

Timestamp                                                       

2018-09-20 12:59:57  cat 1    obj_1   name_1   1

2018-09-20 12:58:53  cat 1    obj_2   name_2   1

2018-09-20 12:57:44  else 1   obj_3   name_1   1

2018-09-20 12:57:19  cat 11   obj_2   name_1   1

2018-09-20 12:56:17  cat 11   obj_2   name_1   1

有了这个df,我正在为每一列准备一组数据透视表,显示出现的百分比 (%) 以及它的计数 (N):


df[['M1']].pivot_table(index=df.index.date, aggfunc=(

    ('%', lambda x: len(x) / df['M1'].count()), 

    ('N', 'size')))

当我遇到准备两个系列的数据透视表时,我想显示M1不是在整个数据框中而是与 M2 类别相关的出现百分比。到目前为止,我已经尝试将分母设置为M2计数,但它是总体计数,而不是M1特定M2类别中的计数:


df[['M1', 'M2']].pivot_table(columns='M2', index='M1', aggfunc=(lambda x: len(x) / df['M2'].count()))

任何线索如何获得M1每个M2类别中的特定百分比?预期输出:


M2       obj_1    obj_2    obj_3

M1

cat 1    value1   value*   value*

cat 2    value*   value*   value*

...      ...      ...      ...

cat 11   value*   value*   value*

else 1   value*   value*   value*

其中value1是等的cat 1所有出现中出现的次数。obj_1


紫衣仙女
浏览 115回答 1
1回答

森栏

您可以groupby查找M2每个类别的数量,并将其作为列添加到您的数据框中,如下所示df['count_M2'] = df.groupby('M2')['M1'].transform('count')然后运行该pivot_table函数以获取M1每组中M2的百分比df.pivot_table(values=['count_M2'], index=['M1'], columns=['M2'],                aggfunc=lambda x: len(x) / x.iloc[0])细节df                  Time      M1     M2      M3  M4  count_M20  2018-09-20 12:59:57   cat 1  obj_1  name_1   1         11  2018-09-20 12:58:53   cat 1  obj_2  name_2   1         32  2018-09-20 12:57:44  else 1  obj_3  name_1   1         13  2018-09-20 12:57:19  cat 11  obj_2  name_1   1         34  2018-09-20 12:56:17  cat 11  obj_2  name_1   1         3df.pivot_table       count_M2                M2        obj_1     obj_2 obj_3M1                             cat 1       1.0  0.333333   NaNcat 11      NaN  0.666667   NaNelse 1      NaN       NaN   1.0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python