Как проверить, является ли элемент одного списка другим, когда они находятся в pandas столбцах - PullRequest
0 голосов
/ 05 мая 2020

Учитывая фрейм данных

d = {'col1': [['how', 'are', 'you'], ['im', 'fine', 'thanks'], ['you', 'know'], [np.nan]],
     'col2': [['tell', 'how', 'me', 'you'], ['who', 'cares'], ['know', 'this', 'padewan'], ['who', 'are', 'you']]

df = pd.DataFrame(data=d)

Я хочу создать третий столбец col3, который представляет собой любой элемент в списке в col2, который содержится в списке в соответствующей строке в списке в col1, в противном случае np.nan.

Он должен будет принимать любые совпадающие элементы.

В этом случае col3 будет:

           col1                      col2                           col3
0   ['how', 'are', 'you']      ['tell', 'how, 'me', 'you']        ['how', 'you']
1   ['im', 'fine', 'thanks']   ['who', 'cares']                   [np.nan] 
2   ['you', 'know']            ['know', 'this', 'padewan']        ['know']
3   [np.nan]                   ['who', 'are', 'you']              [np.nan]

Я попробовал

df['col3'] = [c in l for c, l in zip(df['col1'], df['col2'])]

, который вообще не работает, поэтому любые идеи будут очень полезны.

Ответы [ 4 ]

4 голосов
/ 05 мая 2020

Примерно так:

df['col3'] = [list(set(a).intersection(b)) for a, b in zip(df.col1, df.col2)]

Вывод:

                 col1                   col2        col3
0     [how, are, you]   [tell, how, me, you]  [you, how]
1  [im, fine, thanks]           [who, cares]          []
2         [you, know]  [know, this, padewan]      [know]
3               [nan]        [who, are, you]          []
3 голосов
/ 05 мая 2020

Другая версия:

df['col3'] = df.apply(lambda x: [*set(x['col1']).intersection(x['col2'])] or [np.nan], axis=1 )

print(df)

Распечатывает:

                 col1                   col2        col3
0     [how, are, you]   [tell, how, me, you]  [how, you]
1  [im, fine, thanks]           [who, cares]       [nan]
2         [you, know]  [know, this, padewan]      [know]
3               [nan]        [who, are, you]       [nan]
2 голосов
/ 05 мая 2020

Я бы написал отдельную функцию с помощью np.intersect1d и применил бы:

def intersect_nan(a,b):
    ret = np.intersect1d(a,b) 
    return list(ret) if len(ret)>0 else [np.nan]

df['col3'] = [intersect_nan(a,b) for a,b in zip(df['col1'], df['col2'])]

Вывод:

                 col1                   col2        col3
0     [how, are, you]   [tell, how, me, you]  [how, you]
1  [im, fine, thanks]           [who, cares]       [nan]
2         [you, know]  [know, this, padewan]      [know]
3               [nan]        [who, are, you]       [nan]
1 голос
/ 06 мая 2020

Примерно так:

 d =  {'col1': [['how', 'are', 'you'], ['im', 'fine', 'thanks'], ['you', 'know'], [numpy.nan]],
                'col2': [['tell', 'how', 'me', 'you'], ['who', 'cares'], ['know', 'this', 'padewan'],
                      ['who', 'are', 'you']]}
        df = pandas.DataFrame(d)
        list_col3 = []
        for index, row in df.iterrows():
            a_set= set(row['col1'])
            b_set= set(row['col2'])
            if len(a_set.intersection(b_set)) > 0:
                list_col3.append(list(a_set.intersection(b_set)))
            else:
                list_col3.append([numpy.nan])
        df['col3'] = list_col3
        print(df)

Вывод:

                 col1                   col2        col3
0     [how, are, you]   [tell, how, me, you]  [how, you]
1  [im, fine, thanks]           [who, cares]       [nan]
2         [you, know]  [know, this, padewan]      [know]
3               [nan]        [who, are, you]       [nan]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...