【问题标题】:How to sum based on the condition of two columns and presented in crosstab format using Pandas?如何根据两列的条件求和并使用 Pandas 以交叉表格式呈现?
【发布时间】:2021-01-24 04:07:12
【问题描述】:

给定下面的数据框:

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

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

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

【问题讨论】:

    标签: python pandas dataframe crosstab


    【解决方案1】:

    考虑下面的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
    

    【讨论】:

    • 谢谢,我从来不知道pivot_table和crosstab可以用来做同样的演示。很好的曝光
    • 是的,它们非常相似。很高兴为您提供帮助。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      相关资源
      最近更新 更多