【发布时间】:2022-01-02 19:47:24
【问题描述】:
我有一个数据框,用于记录每个乐高套装盒中包含的不同乐高部件。 对于每个套装盒,总是有许多不同的常规件,但有时盒子还包含一些额外的备用件。 所以数据框有一个布尔列来区分该条件。
现在我想总结数据集,因此每个 LEGO 组 (groupby set_id) 只得到一行,其中一个新列是该组盒中的总数量(“数量”的总和)。
我的问题是,我还想要两个额外的列来计算其中有多少是“常规”,有多少是“备用”,基于 True/False 列。
有没有办法通过创建一个额外的数据框和一个 .agg() 调用来计算这三个总和列?
我目前的方法不是创建 3 个数据框并合并列:
import pandas as pd
import random
random.seed(1)
# creating sample data:
nrows=15
df = pd.DataFrame([], columns=["set_id","part_id","quantity","is_spare"])
df["set_id"]=["ABC"[random.randint(0,2)] for r in range(0,nrows)]
df["part_id"] = [random.randint(1000,8000) for n in range(0,nrows)]
df["quantity"] = [random.randint(1,10) for n in range(0,nrows)]
df["is_spare"]=[random.random()>0.75 for r in range(0,nrows)]
print(df)
# grouping into a new dfsummary dataframe: HOW TO DO IT IN JUST ONE STEP ?
# aggregate sum of ALL pieces:
dfsummary = df.groupby("set_id", as_index=False) \
.agg(num_pieces=("quantity","sum"))
# aggregate sum of "normal" pieces:
dfsummary2 = df.loc[df["is_spare"]==False].groupby("set_id", as_index=False) \
.agg(normal_pieces=("quantity","sum"))
# aggregate sum of "spare" pieces:
dfsummary3 = df.loc[df["is_spare"]==True].groupby("set_id", as_index=False) \
.agg(spare_pieces=("quantity","sum"))
# Putting all aggregate columns together:
dfsummary = dfsummary \
.merge(dfsummary2,on="set_id",how="left") \
.merge(dfsummary3,on="set_id",how="left")
print(dfsummary)
原始数据:
set_id part_id quantity is_spare
0 A 4545 1 False
1 C 5976 1 False
2 A 7244 9 False
3 B 7284 1 False
4 A 1017 7 False
5 B 6700 4 True
6 B 4648 7 False
7 B 3181 1 False
8 C 6910 9 False
9 B 7568 4 True
10 A 2874 8 True
11 A 5842 8 False
12 B 1837 9 False
13 A 3600 4 False
14 B 1250 6 False
汇总数据:
set_id num_pieces normal_pieces spare_pieces
0 A 37 29 8.0
1 B 32 24 8.0
2 C 10 10 NaN
我看到了这个Stackoverflow question,但我的情况有些不同,因为 sum() 函数只会应用于目标列的某些行,具体取决于其他列的 True/False 值。
编辑:
我用一列 (color) 扩展了原始数据集,以检查 @sammywemmy 的答案是否可以缩放以一次对多列进行分组和取消堆叠:
df["color"]=[["black","grey","white","red"][random.randint(0,3)] \
for r in range(0,nrows)]
set_id part_id quantity is_spare color
0 A 4545 1 False red
1 C 5976 1 False grey
2 A 7244 9 False white
3 B 7284 1 False white
4 A 1017 7 False red
5 B 6700 4 True red
6 B 4648 7 False black
7 B 3181 1 False red
8 C 6910 9 False grey
9 B 7568 4 True red
10 A 2874 8 True red
11 A 5842 8 False grey
12 B 1837 9 False white
13 A 3600 4 False white
14 B 1250 6 False black
汇总数据:
set_id num_pieces normal_pieces spare_pieces black grey red white
0 A 37 29 8.0 NaN 8.0 16.0 13.0
1 B 32 24 8.0 13.0 NaN 9.0 10.0
2 C 10 10 NaN NaN 10.0 NaN NaN
【问题讨论】:
标签: python pandas dataframe pandas-groupby aggregate