Панды: как выбрать индекс / метку строки в кадре данных, который соответствует условию - PullRequest
4 голосов
/ 11 мая 2019

У меня есть кадр данных, который выглядит следующим образом

        fail    success
aa      1       0
ab      1       0
aback   0       1
abandon 3       1
abate   0       1
abc     1       0

, где "fail" и "success" - это имена столбцов, а "aa", "ab", "aback" и т. Д.метки строк.В таблице указано, сколько раз слово («ab», «aback» и т. Д.) Встречается в группе текстов (2 группы: «fail» и «success»).

Есть ли способсвязать каждую метку строки с именем столбца на основе того, является ли слово уникальным в одной из групп?

Вывод должен выглядеть примерно так:

{'fail' : [("aa",1),("ab",1),("abc",1)], 'success' : [("aback",1),("abate",1)]}

Спасибо!

Ответы [ 4 ]

3 голосов
/ 11 мая 2019

Вы можете сделать это с 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)]}

Это будет работать, даже если у вас более двух столбцов.Фактически для каждого столбца получаются пары индекс-значение, которые удовлетворяют следующим двум условиям:

  1. Значение этого индекса в этом столбце больше 0
  2. Значение равно 0 для всех других индексов в этом столбце

Если вы предполагаете, что нет строк, для которых все значения отличны от нуля, вы можете отбросить первое условие, которое дает это:

{col: list(df.loc[(df.drop(columns=col) == 0).all(axis=1), col].iteritems())
 for col in df.columns}
0 голосов
/ 11 мая 2019

Вы можете использовать:

new_dict = {}
new_dict['fail'] = df[((df['fail']==1)&(df['success']==0))]['fail'].reset_index().values.tolist()
new_dict['success'] = df[((df['fail']==0)&(df['success']==1))]['success'].reset_index().values.tolist()

Выход:

{'fail': [['aa', 1], ['ab', 1], ['abc', 1]], 'success': [['aback', 1], ['abate', 1]]}
0 голосов
/ 11 мая 2019

Используя панд nunique, с stack, затем groupby получите dict на to_dict

df[df.ne(0).nunique(1).ne(1)].\
    replace(0,np.nan).\
      stack().\
          reset_index(0).apply(tuple,1).\
              groupby(level=0).apply(list).to_dict()
Out[497]: 
{'fail': [('aa', 1.0), ('ab', 1.0), ('abc', 1.0)],
 'success': [('aback', 1.0), ('abate', 1.0)]}
0 голосов
/ 11 мая 2019

Давайте сначала сделаем «успех» наполовину:

df.success[df.fail==0]

Это даст вам значения успеха, где сбой был равен нулю:

aback    1
abate    1

Если вам действительно нужен список-lists, сделайте это:

df.success[df.fail==0].reset_index().values.tolist()

Теперь у вас есть:

[['aback', 1], ['abate', 1]]

В качестве альтернативы, для списка кортежей, как в вашем примере вывода:

s = df.success[df.fail==0]
list(zip(s.index, s))

Поменяйте местами успех и неудачу на другую половину результата, и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...