#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