Как выделить уникальное значение данных в двух разных столбцах кадра данных? - PullRequest
2 голосов
/ 03 февраля 2020

Я хочу выделить повторяющиеся значения данных в двух разных столбцах кадра данных. Например:

df1:

item Node

A      B

A      C

A      D

B      A

C      A

Я хочу, чтобы выходные данные выглядели так:

item Node Same

A      B  False

A      C  False

A      D  False

B      A  True

C      A  True

Я хочу показать дублирующиеся значения, например, если есть AB, я хочу выделить BA. Для этого я создал другой фрейм данных и поменял значения двух столбцов.

df2:

item   node

B      A

C      A

D      A

A      B

A      C

Я пытаюсь проверить как узел df1 ['item'] == df2 [' '] и df1 [' node '] == df2 [' item '], если значение равно true, значение повторяется. Поскольку A входит в элемент df1, он проверяет наличие A в узле df2 и, соответственно, проверяет, что соответствующий узел A A входит в столбец элемента df2.

import pandas as pd
import numpy as np
data=pd.read_excel(r'C:\Users\eumukar\Desktop\test data xl.xlsx')
df1=pd.DataFrame(data,columns=['item','node'])
df2=pd.DataFrame(data,columns=['node','item'])
df1['Same']=np.where((df1['item']==df2['node']) & (df1['node']==df2['item']),'True','False')
print(df1)

Я получаю вывод в виде:

item node   Same
 A    B  False
 A    C  False
 A    D  False
 B    A  False
 C    A  False

Ответы [ 3 ]

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

Если все пары item с Node не дублируются, используйте np.sort (если важна производительность) с DataFrame.duplicated:

df1['Same'] = pd.DataFrame(np.sort(df1[['item','Node']], axis=1), index=df.index).duplicated()
print (df1)
  item Node   Same
0    A    B  False
1    A    C  False
2    A    D  False
3    B    A   True
4    C    A   True
3 голосов
/ 03 февраля 2020

Понимание списка:

df["same"] = [True if len(df.loc[df["Node"].eq(i)])>1 else False for i in df["Node"]]
print (df)

  item Node   same
0    A    B  False
1    A    C  False
2    A    D  False
3    B    A   True
4    C    A   True

Или np.where:

s = set(df.loc[df["Node"].duplicated(),"Node"])
df["same"] = np.where(df["Node"].isin(s), True, False)
print (df)

  item Node   same
0    A    B  False
1    A    C  False
2    A    D  False
3    B    A   True
4    C    A   True
2 голосов
/ 03 февраля 2020

Вы можете преобразовать каждую строку в frozenset и использовать метод duplicated:

df.apply(frozenset, axis=1).duplicated()

Выход:

0    False
1    False
2    False
3     True
4     True
dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...