#pandas #pivot-table
#pandas #сводная таблица
Вопрос:
Я обещаю, что я погуглил это — я предполагаю, что с самого начала я использую неправильный подход, так что…
Давайте предположим, что у меня есть фрейм данных со многими 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
как я могу вернуть список parts
с пройденным = 1? ( part_1 здесь, поскольку все тесты пройдены)?
как я могу вернуть список parts
с пройденным> 50%?(часть 3 здесь )
цель растяжения: получить order
все части…
Я предполагаю, что основная причина моей неудачи заключается в том, что мне не удается отфильтровать сводную таблицу, как если бы это был «обычный» фрейм данных (я предполагаю, что не удается понять мультииндекс, не так ли?)
Ответ №1:
Вы пытаетесь:
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']
Ответ №2:
Основываясь на ответе Скотта, после того, как вы получите его вывод pivot
, вы можете вызвать
pivot[pivot['order','passed']==1].index
Чтобы получить parts
индексы, которые имеют . passed==1
Вывод:
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')