Сравнение списков со столбцами Dataframe (более одного столбца) - PullRequest
0 голосов
/ 11 марта 2020

У меня есть список списка:

l=[['A,B,C,D', 'Z', 'category1'],
 ['A,B,C', 'Z', 'category2'],
 ['E,F,G,H', 'T', 'category4'],
 ['A,E,H', 'T', 'category4']]

и DataFrame вроде:

Col1       Col2       Col3
A          Z          category1
A,B,C,D    Z          category1
E,F,G,H,I  T          category4
A,E,H      T          category4 
A,E,H      T          category5
A,E,H      U          category4   

Поэтому я хочу сравнить список списка со столбцами данных (принимая все 3 столбца во внимание). Сравнение с l oop не работает эффективно, есть ли способ сделать сравнение и вернуть только совпадающие строки из фрейма данных?

Desired Output DataFrame:

Col1       Col2       Col3
A,B,C,D    Z          category1
A,E,H      T          category4 

Спасибо !!

Ответы [ 3 ]

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

Один способ использует pandas .Series.duplicated метод:

#df = <your DataFrame defined here>

l=[['A,B,C,D', 'Z', 'category1'],
 ['A,B,C', 'Z', 'category2'],
 ['E,F,G,H', 'T', 'category4'],
 ['A,E,H', 'T', 'category4']]

listdf=pd.DataFrame(data = l, columns=df.columns)   #transform list to dataframe
df=df.append(listdf)  #append your list to the main dataframe

duplicates=df.duplicated() # find duplicate rows; returns series of booleans

print(df[duplicates]) # print duplicate rows

Выход:

#      Col1 Col2       Col3
#0  A,B,C,D    Z  category1
#3    A,E,H    T  category4
0 голосов
/ 11 марта 2020

Создать DataFrame из списка и затем использовать DataFrame.merge с внутренним объединением по умолчанию, если нет параметра on, оно объединяется всеми столбцами в обоих DataFrame s:

l=[['A,B,C,D', 'Z', 'category1'],
 ['A,B,C', 'Z', 'category2'],
 ['E,F,G,H', 'T', 'category4'],
 ['A,E,H', 'T', 'category4']]

df = pd.DataFrame(l, columns=['Col1','Col2','Col3']).merge(df)
print (df)
      Col1 Col2       Col3
0  A,B,C,D    Z  category1
1    A,E,H    T  category4
0 голосов
/ 11 марта 2020

Если вы ищете точное совпадение всех трех столбцов, почему бы не попытаться объединить эти три столбца с четвертым столбцом:

df['col4']=df['col1']+df['col2']+df['col3']

, который возвращает:

        col1 col2       col3                 col4
0          A    Z  category1          AZcategory1
1    A,B,C,D    Z  category1    A,B,C,DZcategory1
2  E,F,G,H,I    T  category4  E,F,G,H,ITcategory4
3      A,E,H    T  category4      A,E,HTcategory4
4      A,E,H    T  category5      A,E,HTcategory5
5      A,E,H    U  category4      A,E,HUcategory4

И вы можете сравнить 'col4' со связанными строками в вашем списке list_join.

list_join=[''.join(item) for item in l]

, который выглядит следующим образом:

['A,B,C,DZcategory1', 'A,B,CZcategory2', 'E,F,G,HTcategory4', 'A,E,HTcategory4']

И затем объединить на основе общих значений:

common =df[df['col4'].isin(list_join)]

Преимущество состоит в том, что вам нужно искать только в одном столбце вместо всех трех, что значительно ускоряет вашу работу. Недостатком было бы меньшая гибкость.

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