Вы можете сделать это с dict
пониманием:
{col: list(df.loc[(df[col] > 0) & (df.drop(columns=col) == 0).all(axis=1), col].iteritems())
for col in df.columns}
Вывод:
{'fail': [('aa', 1), ('ab', 1), ('abc', 1)],
'success': [('aback', 1), ('abate', 1)]}
Это будет работать, даже если у вас более двух столбцов.Фактически для каждого столбца получаются пары индекс-значение, которые удовлетворяют следующим двум условиям:
- Значение этого индекса в этом столбце больше 0
- Значение равно 0 для всех других индексов в этом столбце
Если вы предполагаете, что нет строк, для которых все значения отличны от нуля, вы можете отбросить первое условие, которое дает это:
{col: list(df.loc[(df.drop(columns=col) == 0).all(axis=1), col].iteritems())
for col in df.columns}