Отфильтрованная сводка и сведения после сводной таблицы

#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')