如何基于列进行内爆(pandas 爆炸的反向)
How to implode(reverse of pandas explode) based on a column
我有一个如下所示的数据框 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?
如果您想要 explode 的“相反”,则意味着将其放入解决方案 #1 的列表中。您还可以在解决方案 #2 中作为字符串加入:
在 .agg
groupby 函数中对 'APPLICABLE_DAYS'
列使用 lambda x: x.tolist()
:
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 函数中对 'APPLICABLE_DAYS'
列使用 lambda x: ",".join(x)
:
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
,那么您只需将 Cases
和 Delivery
列的 mean
更改为 sum
。
您的结果看起来更像是总和,而不是平均值;下面的解决方案使用 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
如果是平均值,那么你可以把'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
我有一个如下所示的数据框 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?
如果您想要 explode 的“相反”,则意味着将其放入解决方案 #1 的列表中。您还可以在解决方案 #2 中作为字符串加入:
在 .agg
groupby 函数中对 'APPLICABLE_DAYS'
列使用 lambda x: x.tolist()
:
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 函数中对 'APPLICABLE_DAYS'
列使用 lambda x: ",".join(x)
:
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
,那么您只需将 Cases
和 Delivery
列的 mean
更改为 sum
。
您的结果看起来更像是总和,而不是平均值;下面的解决方案使用 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
如果是平均值,那么你可以把'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