python - 在熊猫中,计算列中行值的乘积(按类别分组)并将乘积值分配给每组中的所有行?
问题描述
我的数据框 df 有 3 列'part':部件号'test':测试名称'test_pass':每个测试的通过或失败结果。1 是通过,0 是失败。
我想创建第四列“part_pass”。对于任何“部分”,如果至少有一个“test_pass”等于 0,则该“部分”是失败的部分。对于那部分,我想让“part_pass”对于该“部分”的所有行都等于 0。
对于任何“部分”,如果所有“测试通过”都等于 1,则该“部分”是通过部分。对于那部分,我想让“part_pass”对于该“部分”的所有行都等于 1。
如何计算按“part”分组的“test_pass”的乘积,并将结果值按部分组分配给“part_pass”的行?
解决方案
重现数据集的代码:
df = pd.DataFrame()
df["part"] = [1,2,3,1,2,3,1,2,3]
df["test"] = ["test1"]*3 + ["test2"]*3 + ["test3"]*3
df["test_pass"] = [1,1,0,1,1,1,1,1,1]
part test test_pass
0 1 test1 1
1 2 test1 1
2 3 test1 0
3 1 test2 1
4 2 test2 1
5 3 test2 1
6 1 test3 1
7 2 test3 1
8 3 test3 1
您需要以下逻辑(几乎是您得到的,但使用索引):
df2 = df.set_index("part")
df2["part_pass"] = df.groupby("part")["test_pass"].prod()
df2 = df2.reset_index()
part test test_pass part_pass
0 1 test1 1 1
1 2 test1 1 1
2 3 test1 0 0
3 1 test2 1 1
4 2 test2 1 1
5 3 test2 1 0
6 1 test3 1 1
7 2 test3 1 1
8 3 test3 1 0
推荐阅读
- swift - 我的 BeizerPath 在我的标签之上。我怎样才能让我的标签出现在上面?
- java - IntelliJ 无法识别 JUnitRuleMockery 中的模拟方法
- javascript - Google 的标签管理器将 ```jsx 添加到我的网站,这个标签有什么用?
- c++ - c ++运算符==在链表中重载
- c++ - 避免 SPSC 队列索引的错误共享
- oracle - 尽管条件不满足,如何停止执行 oracle 触发器
- python - Python非凸优化
- python - pyArango bulkImport_json 抱怨指标不当
- java - 工具栏在通知栏下方移动
- python - 如何使用python以特定方式合并2个列表