首页 > 解决方案 > 如何根据两列的条件求和并使用 Pandas 以交叉表格式呈现?

问题描述

鉴于以下数据框:

Name    Activity    Hour    Month
A       TT          5       1
A       TT          2       1
A       UU          1       1
A       UU          1       2
A       UU          1       3
B       TT          40      3
C       UU          10      1
D       TT          2       2
D       TT          2       2
D       TT          2       2
D       TT          5       1

下一步是如果行具有相同的列值和 ,则获得Name总和Activity

例如,对于案例Name: AActivity: TT将给出总和7

然后,我想以交叉表格式呈现它,它是根据month和分组的activity,如下所示

                Month
       1           2          3
    TT  UU      TT  UU      TT  UU
A   7   1       0   1       0   1
B   0   0       0   0       40  0
C   0   10      0   0       0   0
D   5   0       6   0       0   0

请问这是否可以直接使用pandas crosstab来实现?

ps,类似但不同的主题已在此处单独讨论。请让我知道这个线程是否被认为是 OP 的副本

标签: pythonpandasdataframecrosstab

解决方案


考虑以下df:

In [93]: df
Out[93]: 
   Name Activity  Hour  Month
0     A       TT     5      1
1     A       TT     2      1
2     A       UU     1      1
3     A       UU     1      2
4     A       UU     1      3
5     B       TT    40      3
6     C       UU    10      1
7     D       TT     2      2
8     D       TT     2      2
9     D       TT     2      2
10    D       TT     5      1

解决方案:1如果你想使用pd.crosstab,你可以这样做:

In [92]: pd.crosstab(df.Name, columns=[df.Month, df.Activity], values=df.Hour, aggfunc='sum').fillna(0)
Out[92]: 
Month       1          2          3     
Activity   TT    UU   TT   UU    TT   UU
Name                                    
A         7.0   1.0  0.0  1.0   0.0  1.0
B         0.0   0.0  0.0  0.0  40.0  0.0
C         0.0  10.0  0.0  0.0   0.0  0.0
D         5.0   0.0  6.0  0.0   0.0  0.0

解决方案:2 您可以使用df.pivot_table

In [89]: df.pivot_table(index='Name', columns=['Month', 'Activity'], values='Hour', aggfunc='sum', fill_value=0)
Out[89]: 
Month     1      2      3   
Activity TT  UU TT UU  TT UU
Name                        
A         7   1  0  1   0  1
B         0   0  0  0  40  0
C         0  10  0  0   0  0
D         5   0  6  0   0  0

推荐阅读