#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
электронная почта-это имя столбца индекса (левый столбец), а значения находятся в
правом столбце.