Умножьте pandas фрейм данных как маску - PullRequest
1 голос
/ 26 февраля 2020

У меня есть 2 pandas фреймов данных, таких как:

вхождения

doc    0    1    2    ...    1809(=n)
  0    0    0    1    ...       1
  1    0    0    1    ...       0
  2    0    0    1    ...       0
  ..  ..    ..   ..   ...       .
  m   ......................... 0

словарь

id    term
 0     foo
 1     bar
 2     lorem
 ..    ..
 n     ipsum

Я пытаюсь получить для каждой строки «вхождений» термины (через идентификатор, то есть заголовок столбца в первом кадре данных), для которых в качестве значения ячейки указано «1». В моем примере, учитывая первый ряд вхождений, у меня было бы: ['lorem', 'ipsum']

Спасибо

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Вот идея с np.where

occurrences = pd.DataFrame([[0,0,1,1],[0,1,0,1], [1,0,1,0]])
dictionary=pd.DataFrame({'term':['foo','bar', 'lorem', 'ipsum']})

idx = np.where(occurrences)
(pd.Series(dictionary.values[idx[1]].ravel())
   .groupby(idx[0]).agg(list)
)

Вывод:

0    [lorem, ipsum]
1      [bar, ipsum]
2      [foo, lorem]
dtype: object
0 голосов
/ 27 февраля 2020

После некоторых попыток у меня все получилось (возможно, не так круто ..)

def get_vocabulary(occurences, dictionary):
    for index, row in dtm_.iterrows():
        # iterate on each row == each document
        doc = row.values.tolist() # convert row to list
        ngrams = []
        for i in range(len(doc)): # for each element
            if doc[i] != 0: 
                ngrams.append(dictionary.iloc[i, 1]) # match from vocabulary the term with positional index
    return ngrams

Окончательный результат:

['scheduling', 'distributed', 'deadline', .... , 'rate monotonic scheduling algorithm']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...