【问题标题】:How to implode(reverse of pandas explode) based on a column如何基于列内爆(熊猫的反向爆炸)
【发布时间】:2020-10-06 23:54:43
【问题描述】:

我有一个如下所示的数据框 df

  NETWORK       config_id       APPLICABLE_DAYS  Case    Delivery  
0   Grocery     5399            SUN               10       1        
1   Grocery     5399            MON               20       2       
2   Grocery     5399            TUE               30       3        
3   Grocery     5399            WED               40       4       

我想内爆(将 Applicable_days 从多行组合成单行,如下所示)并获得每个 config_id 的平均案例和交付

  NETWORK       config_id       APPLICABLE_DAYS      Avg_Cases    Avg_Delivery 
0   Grocery     5399            SUN,MON,TUE,WED         90           10

使用网络上的 groupby,config_id 我可以获得如下所示的 avg_cases 和 avg_delivery。

df.groupby(['network','config_id']).agg({'case':'mean','delivery':'mean'})

但是我如何能够在执行此聚合时加入 APPLICABLE_DAYS?

【问题讨论】:

    标签: pandas numpy explode implode


    【解决方案1】:

    如果您想要爆炸的“对立面”,那么这意味着将其放入解决方案 #1 中的列表中。您也可以在解决方案 #2 中作为字符串加入:

    .agg groupby 函数中将 lambda x: x.tolist() 用于 'APPLICABLE_DAYS' 列:

    df = (df.groupby(['NETWORK','config_id'])
          .agg({'APPLICABLE_DAYS': lambda x: x.tolist(),'Case':'mean','Delivery':'mean'})
          .rename({'Case' : 'Avg_Cases','Delivery' : 'Avg_Delivery'},axis=1)
          .reset_index())
    df
    Out[1]: 
       NETWORK  config_id       APPLICABLE_DAYS  Avg_Cases  Avg_Delivery
    0  Grocery       5399  [SUN, MON, TUE, WED]         25           2.5
    

    .agg groupby 函数中将lambda x: ",".join(x) 用于'APPLICABLE_DAYS' 列:

     df = (df.groupby(['NETWORK','config_id'])
          .agg({'APPLICABLE_DAYS': lambda x: ",".join(x),'Case':'mean','Delivery':'mean'})
          .rename({'Case' : 'Avg_Cases','Delivery' : 'Avg_Delivery'},axis=1)
          .reset_index())
    df
    Out[1]: 
       NETWORK  config_id       APPLICABLE_DAYS  Avg_Cases  Avg_Delivery
    0  Grocery       5399       SUN,MON,TUE,WED         25           2.5
    

    如果您正在寻找sum,那么您只需将CasesDelivery 列的mean 更改为sum

    【讨论】:

      【解决方案2】:

      您的结果看起来更像是一个总和,而不是平均值;下面的解决方案使用named aggregation

          df.groupby(["NETWORK", "config_id"]).agg(
          APPLICABLE_DAYS=("APPLICABLE_DAYS", ",".join),
          Total_Cases=("Case", "sum"),
          Total_Delivery=("Delivery", "sum"),
      )
      
                              APPLICABLE_DAYS       Total_Cases   Total_Delivery
      NETWORK config_id           
      Grocery 5399                SUN,MON,TUE,WED           100      10
      

      如果是均值,则可以将“总和”更改为“均值”:

      df.groupby(["NETWORK", "config_id"]).agg(
          APPLICABLE_DAYS=("APPLICABLE_DAYS", ",".join),
          Avg_Cases=("Case", "mean"),
          Avg_Delivery=("Delivery", "mean"),
      )
      
                          APPLICABLE_DAYS   Avg_Cases Avg_Delivery
      NETWORK config_id           
      Grocery 5399         SUN,MON,TUE,WED      25      2.5
      

      【讨论】:

        猜你喜欢
        • 2019-01-15
        • 2018-08-03
        • 1970-01-01
        • 2022-01-25
        • 2018-06-20
        • 2019-12-20
        • 2023-01-19
        • 2021-05-27
        相关资源
        最近更新 更多