Как получить количество неповторяющихся элементов в списке столбцов в фрейме данных Pandas?

#python-3.x #pandas #duplicates

Вопрос:

Я перерыл многие SO посты, чтобы просто найти Pandas решение, соответствующее моему случаю, но я не смог.

Проблема, с которой я столкнулся, заключается в том, что у меня есть Dataframe , что выглядит примерно так, как показано ниже:

 $ df
  email               hashes  
0 user@example.com    (iz3s65inn942j1bmedv., iz3s65inn942j1bmedv., 10$0mw1ewlhqlm0l)
 

В моем случае nunique() и drop_duplicates() не работает, так как мне нужно подсчитать количество неповторяющихся элементов в самом кортеже. В приведенном выше случае результат был бы:

 $ df
  email               hashes
0 user@example.com    1
 

Как я могу достичь этого результата и получить количество неповторяющихся элементов кортежа в столбце хэши?

Комментарии:

1. @jezrael drop_duplicates работает со строками фреймов данных, а не с кортежем внутри столбца. Если вы вызовете эту функцию, в строке ничего не произойдет.

Ответ №1:

Используйте пользовательскую лямбда-функцию только с Counter уникальными значениями для подсчета:

 from collections import Counter

df['hashes'] = df['hashes'].apply(lambda x: sum(v == 1 for k, v in Counter(x).items()))
print (df)
              email  hashes
0  user@example.com       1
 

Панды единственная альтернатива с DataFrame cosntructor и DataFrame.nunique :

 df['hashes'] = pd.DataFrame(df['hashes'].tolist(), index=df.index).nunique(axis=1)
print (df)
              email  hashes
0  user@example.com       1
 

Ответ №2:

Определите следующую функцию, которая будет применяться к каждой группе строк:

 def uniqCnt(grp):
    return grp.hashes.drop_duplicates(keep=False).size
 

Затем примените его к версии df «explodad», сгруппированной по электронной почте:

 result = df.explode(column='hashes').groupby('email').apply(uniqCnt).rename('hashes')
 

В результате получается следующая серия:

 email
user@example.com    1
Name: hashes, dtype: int64
 

электронная почта-это имя столбца индекса (левый столбец), а значения находятся в
правом столбце.