Найти уникальные значения между двумя столбцами - PullRequest
0 голосов
/ 22 марта 2020

Я задавал разные вопросы, но не нашел такого, который подходит для этого случая.

У меня есть две колонки с электронными письмами. Первый столбец (CollectedE) состоит из 32000, а второй столбец (UndE) состоит из 14987.

Мне нужно найти все электронные письма во втором столбце, который не существует в первом столбце, и вывести их в совершенно новый столбец.

Я пробовал что-то подобное, но это не работает из-за двух разных длин в столбцах.

import pandas as pd
import numpy as np
df = pd.read_csv('data.csv', delimiter=";")

df['is_dup'] = df[['CollectedE', 'UndE']].duplicated()
df['dups'] = df.groupby(['CollectedE', 'UndE']).is_dup.transform(np.sum)
# df outputs:
df['is_dup'] =[![enter image description here][1]][1] df[['CollectedE', 'UndE']].duplicated()
df['dups'] = df.groupby(['CollectedE', 'UndE'])

df

Вот изображение двух столбцов, если это поможет. Но, похоже, все остальные случаи касаются либо удаления дубликатов в одном столбце, либо удаления строк с одинаковыми значениями, поиска частот или аналогичных.

enter image description here

Но я надеюсь, что вы можете помочь. Спасибо!

Ответы [ 4 ]

1 голос
/ 22 марта 2020

Вот что я реализовал. Я использовал правое внешнее объединение и преобразовал выходной столбец в список и добавил его в исходный фрейм данных.

#Creating dataframe
df = pd.DataFrame({'col1': ['x', 'y', 'z', 'x1'], 'col2': ['x', 'x2', 'y', np.nan]})

#Applying right join and keeping values which are present in 2nd column only
df2 = pd.merge(df[['col1']], df[['col2']], how = 'outer', left_on = ['col1'], right_on 
= ['col2'], indicator = True)

df2 = df2[df2['_merge'] == 'right_only'][['col2']]

Чтобы сохранить ту же длину кадра данных, добавляются нулевые значения.

#Creating list and adding it as column in source dataframe
df2_list = df2.append(pd.DataFrame({'col2': [np.nan for x in range(len(df) - 
len(df2))]}))['col2'].to_list()

df['col3'] = df2_list

Вывод:

df
    col1 col2 col3
0    x    x   x2
1    y   x2  NaN
2    z    y  NaN
3   x1  NaN  NaN

Вы можете также преобразовать столбец списка и расширить список пустыми значениями.

1 голос
/ 22 марта 2020

вы можете использовать isin, что довольно просто с ~, чтобы инвертировать операцию.

df = pd.DataFrame({'CollectedE' : ['abc@gmail.com','random@google.com'],
             'UndE' : ['abc@gmail.com','unique@googlemail.com']})

df['new_col'] = df[~df['CollectedE'].isin(df['UndE'])]['UndE']

print(df)
          CollectedE                   UndE                new_col
0      abc@gmail.com          abc@gmail.com                    NaN
1  random@google.com  unique@googlemail.com  unique@googlemail.com
1 голос
/ 22 марта 2020

Вот рабочий пример использования разностного метода индекса и слияния.

df = pd.DataFrame({'column_a':['cat','dog','bird','fish','zebra','snake'],
               'column_b':['leopard','snake','bird','sloth','elephant','dolphin']})

idx1 = pd.Index(df['column_a'])
idx2 = pd.Index(df['column_b'])

x = pd.Series(idx2.difference(idx1), name='non_matching_values')

df.merge(x, how='left', left_on='column_b', right_on=x.values)

column_a    column_b    non_matching_values
0   cat leopard leopard
1   dog snake   NaN
2   bird    bird    NaN
3   fish    sloth   sloth
4   zebra   elephant    elephant
5   snake   dolphin dolphin
1 голос
/ 22 марта 2020

Может быть pandas.Index.difference может вам помочь.

...