如何根据两列的条件求和,并使用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

下一步是如果行具有相同的列NameActivity的值,则获得求和。

例如,对于Name: AActivity: TT的情况,将给出7的总和

然后,我想以交叉选项卡格式呈现它,该格式根据monthactivity分组,如下所示

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

我可以知道这是否可以直接使用熊猫交叉表实现吗?

附言,相似但不同的话题在这里分别讨论。请让我知道这个线程是否被认为是OP 的副本

考虑以下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

您也可以使用groupby作为您之前的问题

df_final = df.groupby(['Month','Activity','Name']).Hour.sum().unstack([0,1], fill_value=0)
Out[338]:
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

最新更新