大熊猫将多个groupby结果放入同一张表

时间:2019-07-17 13:32:59

标签: python pandas dataframe pandas-groupby

我有以下df

ccode    year_month    user    tcode
10       201903        WF      MI
10       201903        WF      MI
10       201903        QQ      MI
10       201903        QQ      MI 
20       201904        BATCH   MI
20       201904        WF      MI
20       201904        BATCH   MI

我喜欢做以下事情,

inv_tran_user_ccode_ym_gr_df = df.groupby(
        ['tcode', 'user', 'ccode', 'year_month']).size().reset_index(name='count')

    inv_tran_user_ccode_ym_gr_df['bus_unit_pct'] = inv_tran_user_ccode_ym_gr_df['count'].div(
        inv_tran_user_ccode_ym_gr_df.groupby(['ccode', 'year_month'])['count'].transform('sum')).mul(
        100).round(2)

    inv_tran_user_ym_gr_df = df.groupby(
        ['tcode', 'user', 'year_month']).size().reset_index(name='count')

    inv_tran_user_ym_gr_df['org_pct'] = inv_tran_user_ym_gr_df['count'].div(
        inv_tran_user_ym_gr_df.groupby(['year_month'])['count'].transform('sum')).mul(
        100).round(2)

我想知道是否可以将org_pctbus_unit_pct放在同一张表中。

ccode    year_month    user    tcode    org_pct    bus_unit_pct
10       201903        WF      MI       50%        50%
10       201903        QQ      MI       50%        50%
20       201904        WF      MI       33%        33%
20       201904        BATCH   MI       67%        67%

3 个答案:

答案 0 :(得分:3)

您已经完成了所有艰苦的工作。这是一个相对简单的merge

(inv_tran_user_ccode_ym_gr_df.drop('count', axis=1)
                            .merge(inv_tran_user_ym_gr_df.drop('count', axis=1),
                                   on=['year_month', 'user', 'tcode']))

导致

  tcode   user  ccode  year_month  bus_unit_pct  org_pct
0    MI  BATCH     20      201904         66.67    66.67
1    MI     QQ     10      201903         50.00    50.00
2    MI     WF     10      201903         50.00    50.00
3    MI     WF     20      201904         33.33    33.33

答案 1 :(得分:2)

您可以简单地将两个数据集合并在一起。

result = pd.merge(inv_tran_user_ccode_ym_gr_df, inv_tran_user_ym_gr_df, on=['tcode','user','year_month'])

答案 2 :(得分:2)

从原始df开始,您还可以尝试使用groupby,然后尝试value_countsnormalize=True: 每个文档:

  

如果为True,则返回的对象将包含唯一值的相对频率。

(df.groupby(['ccode','year_month','tcode'])['user'].value_counts(normalize=True)
 .mul(100).round(2).reset_index(name='bus_unit_pct').rename(columns={'level_3':'user'}))

   ccode  year_month tcode   user  bus_unit_pct
0     10      201903    MI     QQ         50.00
1     10      201903    MI     WF         50.00
2     20      201904    MI  BATCH         66.67
3     20      201904    MI     WF         33.33