Проверка наличия идентичных списков последовательно в pandas dataframe

#python #pandas #list #dataframe

Вопрос:

Привет, у меня есть столбец списков, и я хочу вернуть строки, в которых списки идентичны и имеют одинаковый порядок.

 
d = {'id':[1,2,3], 'lst' : [['GG','PP', 'DD'],['DD','PP', 'GG'], ['GG','PP', 'DD']]}

dd = pd.DataFrame(d)
print(dd)
    id       lst
0   1   [GG, PP, DD]
1   2   [DD, PP, GG]
2   3   [GG, PP, DD]
 

Я делаю это, но получаю неверный вывод

 dd[dd.apply(lambda row: row.lst==row.lst, axis=1)]
    id       lst
0   1   [GG, PP, DD]
1   2   [DD, PP, GG]
2   3   [GG, PP, DD]
 

Мой желаемый результат таков

    id       lst
0   1   [GG, PP, DD]
2   3   [GG, PP, DD]
 

Ответ №1:

Используйте Series.duplicated keep=False с кортежами из списков:

 df = dd[dd['lst'].apply(tuple).duplicated(keep=False)]
print (df)
   id           lst
0   1  [GG, PP, DD]
2   3  [GG, PP, DD]
 

Ответ №2:

интересно, что когда lst является списком списка, дублированный фрейм данных говорит, что он не является хешируемым. Я думаю, что pandas следует изменить дублированный разрешенный список списка, преобразовав список списков в список кортежей в качестве принятого ответа.

 def find_duplicate(df, col):
    """
      df: dataframe
      col: column name
     """
     df_dup = df[df.duplicated(subset=col,keep=False)]
     return df_dup

 d = {'id':[1,2,3], 'lst' : ['c','b','c']}

 dd = pd.DataFrame(d)
 print(dd)

 print(find_duplicate(dd, 'lst'))
 

вывод:

    id lst
0   1   c
2   3   c