我保证我用谷歌搜索过 - 我想我从一开始就采取了错误的方法,所以......
假设我有一个包含许多parts
的数据帧,这些经历了几次checks
,并将在几个orders
内交付。
我很难找到一种方法来列出所有零件的订单,其中 100% 或超过 50% 的检查已通过......
我的意思是:
import pandas as pd
df = pd.DataFrame({
'order' : ['order_A', 'order_A', 'order_A', 'order_A', 'order_B', 'order_B', 'order_B' ],
'part' : ['part_1', 'part_1', 'part_2', 'part_2', 'Part_3', 'Part_3', 'Part_3', ],
'check' : ['passed', 'passed', 'failed', 'failed', 'failed', 'failed', 'passed' ],
})
pivot = pd.pivot_table(
data = df,
index = ['part'],
columns = ['check'],
aggfunc = 'count',
fill_value = pd.NA ,
margins = True)
percent_pivot = pivot.div( pivot.iloc[:,-1], axis=0 )
这里的原始数据非常基本,有很多顺序,很多部分是实际的数据集:
order part check
0 order_A part_1 passed
1 order_A part_1 passed
2 order_A part_2 failed
3 order_A part_2 failed
4 order_B Part_3 failed
5 order_B Part_3 failed
6 order_B Part_3 passed
列表数据透视表,我认为距离我正在寻找的需求只有一半,是:
order
check failed passed All
part
Part_3 0.666667 0.333333 1.0
part_1 <NA> 1 1.0
part_2 1 <NA> 1.0
All 0.571429 0.428571 1.0
如何取回 pass = 1 的parts
列表? (part_1这里,因为所有测试都通过了) ?
我怎样才能找回通过> 50%的parts
列表?(part_3这里)
拉伸目标:获得零件的order
...
我想我失败的根本原因是我没有设法过滤数据透视表,就好像它是"常规"数据帧一样(我想无法掌握多索引,不是吗?
你试试:
pivot.div(pivot[('order','All')], axis=0)
输出:
order
check failed passed All
part
Part_3 0.666667 0.333333 1.0
part_1 <NA> 1 1.0
part_2 1 <NA> 1.0
All 0.571429 0.428571 1.0
要获取超过 100% 的所有部件的列表,请执行以下操作:
percent_pivot.index[np.where(percent_pivot[('order','passed')] == 1)].tolist()
输出:
['part_1']
在斯科特的回答之上,在你得到他的输出pivot
后,你可以调用
pivot[pivot['order','passed']==1].index
获取具有passed==1
的parts
aka 索引。输出:
Index(['part_1'], dtype='object', name='part')
您可以根据计算方式对百分比执行类似操作,但您应该修改布尔值以使用np.isclose
来覆盖浮点错误(请参阅此处的 python 浮点错误)。例如:
pivot[
np.isclose(pivot['order','passed'].fillna(0),1/3)
].index
输出:
Index(['Part_3'], dtype='object', name='part')