【问题标题】:Counting unique values in a column in pandas dataframe like in Qlik?像 Qlik 一样计算 pandas 数据框中的列中的唯一值?
【发布时间】:2018-01-27 08:03:54
【问题描述】:

如果我有这样的表:

df = pd.DataFrame({
         'hID': [101, 102, 103, 101, 102, 104, 105, 101],
         'dID': [10, 11, 12, 10, 11, 10, 12, 10],
         'uID': ['James', 'Henry', 'Abe', 'James', 'Henry', 'Brian', 'Claude', 'James'],
         'mID': ['A', 'B', 'A', 'B', 'A', 'A', 'A', 'C']
})

我可以在 Qlik 中执行 count(distinct hID) 来计算 5 的唯一 HID。如何使用 pandas 数据框在 python 中做到这一点?或者也许是一个numpy数组?同样,如果要执行count(hID),我将在 Qlik 中获得 8。在 pandas 中等效的方法是什么?

【问题讨论】:

  • @piRSquared 谢谢。我可以做类似 df[['dID','hID']].agg(['count', 'size', 'nunique']) 之类的事情,它可以工作。但是与 groupby 结合使用时不起作用。所以 df[['dID','hID']].groupby('mID').agg(['count', 'size', 'nunique']) 说 KeyError。有没有办法选择特定的列并应用条件?
  • 三种方式df[['mID', 'dID','hID']].groupby('mID').agg(['count', 'size', 'nunique'])
  • df[['dID','hID']].groupby(df['mID']).agg(['count', 'size', 'nunique'])
  • df.groupby('mID')[['dID', 'hID']].agg(['count', 'size', 'nunique'])

标签: python pandas numpy qlikview qliksense


【解决方案1】:

对于没有重复的行的唯一计数

df['hID'].nunique()

要知道每个唯一行内容重复的数量

df['hID'].value_counts()

【讨论】:

    【解决方案2】:

    我正在寻找类似的东西,我找到了另一种可以帮助你的方法

    • 如果你想统计空值的个数,你可以使用这个函数:
    def count_nulls(s):
        return s.size - s.count()
    
    • 如果您想在唯一计数中包含 NaN 值,则需要将 dropna=False 传递给 nunique 函数。
    def unique_nan(s):
        return s.nunique(dropna=False)
    
    • 以下是使用 titanic 数据集汇总的所有值:
    from scipy.stats import mode
    
    agg_func_custom_count = {
        'embark_town': ['count', 'nunique', 'size', unique_nan, count_nulls, set]
    }
    df.groupby(['deck']).agg(agg_func_custom_count)
    

    您可以找到更多信息Here

    【讨论】:

      【解决方案3】:

      计算不同的值,使用nunique

      df['hID'].nunique()
      5
      

      只计算非空值,使用count

      df['hID'].count()
      8
      

      计算包括空值在内的总值,使用size属性:

      df['hID'].size
      8
      

      编辑以添加条件

      使用布尔索引:

      df.loc[df['mID']=='A','hID'].agg(['nunique','count','size'])
      

      或使用query

      df.query('mID == "A"')['hID'].agg(['nunique','count','size'])
      

      输出:

      nunique    5
      count      5
      size       5
      Name: hID, dtype: int64
      

      【讨论】:

      • 谢谢!我们如何添加条件?像 mID='A' 的 nunique 吗?
      • 如何计算 None 值的数量?我的 df 只有 None,.unique() 返回 0
      • @Gulzar 使用。 isna 喜欢这个 df['col'].isna().sum()
      • 如何计算不同的值,包括 nans?意思是count如果没有nans,或者count+1如果存在任何nan?
      • @Gulzar 要获取不同值的计数,请使用 nunique。有一个参数dropna 默认为 True,但如果将其更改为 False,它将计算不同的值并为 NaN 添加一个。例如,df['val'].nunique(dropna=False)
      【解决方案4】:

      要计算列中的唯一值,例如数据框 dfhID,请使用:

      len(df.hID.unique())
      

      【讨论】:

      • df.hID.nunique() 更具可读性。
      【解决方案5】:

      您可以使用 len 函数来使用唯一属性

      len(df['hID'].unique()) 5

      【讨论】:

        【解决方案6】:

        或者获取每列唯一值的个数:

        df.nunique()
        
        dID    3
        hID    5
        mID    3
        uID    5
        dtype: int64
        

        pandas 0.20.0pd.DataFrame.agg 中的新功能

        df.agg(['count', 'size', 'nunique'])
        
                 dID  hID  mID  uID
        count      8    8    8    8
        size       8    8    8    8
        nunique    3    5    3    5
        

        您始终可以在groupby 中执行agg。最后我使用了stack,因为我更喜欢这个演示文稿。

        df.groupby('mID').agg(['count', 'size', 'nunique']).stack()
        
        
                     dID  hID  uID
        mID                       
        A   count      5    5    5
            size       5    5    5
            nunique    3    5    5
        B   count      2    2    2
            size       2    2    2
            nunique    2    2    2
        C   count      1    1    1
            size       1    1    1
            nunique    1    1    1
        

        【讨论】:

        • 谢谢!我们如何添加条件?像 mID='A' 的 nunique 吗?
        • @AlhpaDelta 我在最后添加了一些东西。希望有帮助
        【解决方案7】:

        如果我假设 data 是您的数据框的名称,您可以这样做:

        data['race'].value_counts()
        

        这将向您显示不同的元素及其出现次数。

        【讨论】:

        • 如果您想要每个独特项目的比例,您也可以这样做。 data['race'].value_counts(normalize=True)
        【解决方案8】:

        你可以在 pandas 中使用nunique

        df.hID.nunique()
        # 5
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-27
          • 1970-01-01
          • 1970-01-01
          • 2022-11-23
          • 1970-01-01
          相关资源
          最近更新 更多