Сравнение двух столбцов в строке данных - PullRequest
1 голос
/ 24 февраля 2020

У меня есть фрейм данных, который структурирован таким образом, чтобы отражать ход разговора (то есть, где каждая строка является ссылкой на то, что кто-то сказал. См. Ниже:

import pandas as pd
import numpy as np

mydata = [[1, ['hello', 'there', 'how', 'are', 'you']],
      [2, ['i','am', 'well', 'how' 'are', 'you']],
      [1, ['nice', 'weather', 'is', 'it', 'not']],
      [2, ['indeed', 'it','is', 'nice', 'weather']]]

df = pd.DataFrame(mydata)
df.columns=['speaker','turn']

Я Сравнение использования слов на каждом и левом соседних поворотах (то есть на предыдущем повороте). До сих пор я использовал следующее для вычисления пересечения между этими двумя точками:

df['adjacent_turn'] = df.turn.shift(1)
df['intersection'] = df.apply(
    lambda x: np.intersect1d(x.turn, x.adjacent_turn), axis=1
)

Что бы я хотел Теперь, например, есть еще один столбец со словами, которые находятся в столбце 'turn', но , а не в соседнем столбце. Я попробовал то, что мне показалось работоспособным вариантом, но, похоже, я собираюсь где-то неправильно.

df['turn_only'] = df.apply(
    lambda x: [word for word in x.turn if word not in x.adjacent_turn], axis=1
)

Редактировать: То, что я должен был упомянуть раньше, это то, что важно, чтобы я сохранил порядок первоначального поворота. То есть, если я опускаю слово «счастливый» в повороте, который говорит «я чувствую себя счастливым сегодня», мне нужно, чтобы столбец непересекающихся значений возвращал «я», «я», «чувство», «сегодня», а не в случайном порядке.

Ответы [ 2 ]

4 голосов
/ 24 февраля 2020

Я думаю, что вы можете сделать разницу между двумя колонками:

## fill na - set difference wont work with NA values
df['adjacent_turn'] = df['adjacent_turn'].fillna('')

df['turn_only'] = df.apply(lambda x: list(set(x['turn']).difference(x['adjacent_turn'])), 1)

print(df.iloc[:,-2:])

              intersection                      turn_only
0                       []  [hello, how, you, are, there]
1                    [you]          [howare, am, i, well]
2                       []   [weather, is, it, nice, not]
3  [is, it, nice, weather]                       [indeed]
1 голос
/ 24 февраля 2020

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

res = []
for row in df.itertuples():
    try:
        res += [[word for word in row[2] if word not in row[3]]]
    except TypeError:
        res += [[np.NaN]]

df['turn_only'] = res

Результат:

    speaker     turn             adjacent_turn  intersection    turn_only
0   1   [hello, there, how, are, you]   [nan]   []  [nan]
1   2   [i, am, well, howare, you]  [you]   [you]   [i, am, well, howare]
2   1   [nice, weather, is, it, not]    []  []  [nice, weather, is, it, not]
3   2   [indeed, it, is, nice, weather]     [it, is, nice, weather]     [is, it, nice, weather]     [indeed]

Обратите внимание, что это работает лучше и для вашего первого случая (пересечение): в отличие от numpy set ops, порядок сохраняется.

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