Python 如何基于两列的条件求和,并使用Pandas以交叉表格式显示?

Python 如何基于两列的条件求和,并使用Pandas以交叉表格式显示?,python,pandas,dataframe,crosstab,Python,Pandas,Dataframe,Crosstab,给定以下数据帧: 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

给定以下数据帧:

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:A
Activity:TT
将给出
7

然后,我想以交叉表的形式展示它,它是根据
月份
活动
分组的,如下所示

                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交叉表是否可以直接实现这一点吗

p、 在美国,类似但不同的话题被分开讨论。请让我知道,考虑到以下df,此线程是否被视为OP的副本:

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如果您想使用,可以执行以下操作:

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 您可以使用:

考虑以下因素:

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如果您想使用,可以执行以下操作:

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 您可以使用:


您还可以使用
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

您还可以使用
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

谢谢,我从来不知道pivot_表和crosstab可以用来做相同的演示。很好的展示是的,它们非常相似。很高兴提供帮助。谢谢,我从来不知道pivot_table和crosstab可以用来做相同的演示。很好的展示是的,它们非常相似。很乐意帮忙。