为了账号安全,请及时绑定邮箱和手机立即绑定

如何基于列进行内爆(pandas 爆炸的反向)

如何基于列进行内爆(pandas 爆炸的反向)

收到一只叮咚 2023-10-11 20:02:09
我有一个如下所示的数据框 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 呢?
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

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


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


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

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


 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,那么您可以将和列更改mean为。sumCasesDelivery


查看完整回答
反对 回复 2023-10-11
?
守候你守候我

TA贡献1802条经验 获得超10个赞

你的结果看起来更像是一个总和,而不是平均值;下面的解决方案使用命名聚合:


    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

如果是平均值,那么您可以将 'sum' 更改为 'mean' :


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


查看完整回答
反对 回复 2023-10-11
  • 2 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信