分组依据/数据透视

Vis*_*tav 3 python pivot group-by pandas

dummy_df = pd.DataFrame({
    'accnt' : [101, 102, 103, 104, 101, 102, 103, 104, 101, 102, 103, 104, 101, 102, 103, 104, 101, 102, 103, 104],
    'value' : [10, 20, 30, 40, 5, 2, 6, 48, 22, 23, 24, 25, 18, 25, 26, 14, 78, 72, 54, 6],
    'category' : [1,1,1,1,2,2,2,2,1,1,2,2,3,3,3,3,1,3,2,3]
})
Run Code Online (Sandbox Code Playgroud)

dummy_df

accnt   value   category
 101     10      1
 102     20      1
 103     30      1
 104     40      1
 101     5       2
 102     2       2
 103     6       2
 104     48      2
 101     22      1
 102     23      1
 103     24      2
 104     25      2
 101     18      3
 102     25      3
 103     26      3
 104     14      3
 101     78      1
 102     72      3
 103     54      2
 104     6       3
Run Code Online (Sandbox Code Playgroud)

我想获得如下数据框:

accnt   sum_val_c1  count_c1    sum_val_ct2 count_c2    sum_val_c3  count_c3
  101       110        3           5           1              18     1
  102       43         2           2           1              97     2
  103       30         1           84          3              26     1
  104       40         1           73          2              20     2
Run Code Online (Sandbox Code Playgroud)

这是将类别的出现汇总为count_c#并将该类别的值汇总为sum_val_c#并按on分组accnt。我已经尝试过使用pivot()groupby()但是我知道我缺少一些东西。

cs9*_*s95 5

使用groupbyagg以及unstack

u = df.groupby(['accnt', 'category'])['value'].agg(['sum', 'count']).unstack(1)
u.columns = u.columns.map('{0[0]}_c{0[1]}'.format)
u

       sum_c1  sum_c2  sum_c3  count_c1  count_c2  count_c3
accnt                                                      
101       110       5      18         3         1         1
102        43       2      97         2         1         2
103        30      84      26         1         3         1
104        40      73      20         1         2         2
Run Code Online (Sandbox Code Playgroud)

同样,使用pivot_table

u = df.pivot_table(index=['accnt'], 
                   columns='category', 
                   values='value', 
                   aggfunc=['sum', 'count'])
u.columns = u.columns.map('{0[0]}_c{0[1]}'.format)
u

       sum_c1  sum_c2  sum_c3  count_c1  count_c2  count_c3
accnt                                                      
101       110       5      18         3         1         1
102        43       2      97         2         1         2
103        30      84      26         1         3         1
104        40      73      20         1         2         2
Run Code Online (Sandbox Code Playgroud)

  • @Datanovice不用担心。第一个语句的输出(在两个选项中)均返回带有多索引列的结果。然后,我使用了我从安迪(Andy?Scott ...?)那里学到的巧妙技巧,该技巧利用了[`MultiIndex.map`](https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas。 MultiIndex.map.html)以通过下划线将列连接起来以使列变平。注意:这是可能的,因为每个multiIndex在内部都由一个元组列表表示(在步骤#1之后执行u.columns.values来查看我的意思)。 (2认同)