【问题标题】:How to get count of non-duplicate elements in a column list in Pandas Dataframe?如何在 Pandas Dataframe 的列列表中获取非重复元素的计数?
【发布时间】:2021-06-16 19:36:08
【问题描述】:

我翻遍了很多 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

如何实现此结果并获取哈希列中元组的非重复元素的计数?

【问题讨论】:

  • @jezrael drop_duplicates 适用于数据帧的行而不是列内的元组。如果您调用该函数,则该行不会发生任何事情。

标签: python-3.x pandas duplicates


【解决方案1】:

使用带有 Counter 的自定义 lambda 函数仅计算唯一值:

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 的 Pandas 唯一替代方案:

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”版本,按 email 分组:

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

    结果如下系列

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

    email 是索引列(左列)的名称,值在 右栏。

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 2017-06-02
      • 2022-01-19
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2018-09-02
      • 1970-01-01
      相关资源
      最近更新 更多