【问题标题】:Count unique values using pandas groupby使用 pandas groupby 计算唯一值
【发布时间】:2017-05-15 20:43:15
【问题描述】:

我有以下形式的数据:

df = pd.DataFrame({
    'group': [1, 1, 2, 3, 3, 3, 4],
    'param': ['a', 'a', 'b', np.nan, 'a', 'a', np.nan]
})
print(df)

#    group param
# 0      1     a
# 1      1     a
# 2      2     b
# 3      3   NaN
# 4      3     a
# 5      3     a
# 6      4   NaN

组内的非空值始终相同。我想为每个组(它存在的地方)计算一次非空值,然后找到每个值的总计数。

我目前正在以以下(笨拙且低效)的方式执行此操作:

param = []
for _, group in df[df.param.notnull()].groupby('group'):
    param.append(group.param.unique()[0])
print(pd.DataFrame({'param': param}).param.value_counts())

# a    2
# b    1

我确信有一种方法可以更干净且不使用循环,但我似乎无法解决。任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    我觉得你可以用SeriesGroupBy.nunique:

    print (df.groupby('param')['group'].nunique())
    param
    a    2
    b    1
    Name: group, dtype: int64
    

    使用unique 的另一个解决方案,然后通过DataFrame.from_records 创建新的df,通过stack 重塑为Series,最后value_counts

    a = df[df.param.notnull()].groupby('group')['param'].unique()
    print (pd.DataFrame.from_records(a.values.tolist()).stack().value_counts())
    a    2
    b    1
    dtype: int64
    

    【讨论】:

    • 我用df = pd.DataFrame({ 'group': [1, 1, 2, 3, 3, 3, 4], 'param': ['a', 'c', 'b', np.nan, 'c', 'a', np.nan] }) 对其进行了测试,但是您的代码返回不同的输出,因为在每个group 中只使用列表的第一个唯一元素。我的代码返回所有唯一值。如果我了解您需要什么,请检查它。谢谢。
    • 我们如何获得列名
    • @dondapati - 添加.reset_index()
    【解决方案2】:

    这只是解决方案的一个附加组件,以防您不仅要计算唯一值,还要计算其他聚合函数:

    df.groupby(['group']).agg(['min', 'max', 'count', 'nunique'])
    

    【讨论】:

      【解决方案3】:

      我知道这篇文章发布已经有一段时间了,但我认为这也会有所帮助。 我想计算唯一值并按这些唯一值的数量过滤组,我就是这样做的:

      df.groupby('group').agg(['min','max','count','nunique']).reset_index(drop=False)
      

      【讨论】:

        【解决方案4】:

        上述答案也有效,但如果您想在现有数据框中添加具有 unique_counts 的列,可以使用 transform

        df['distinct_count'] = df.groupby(['param'])['group'].transform('nunique')
        

        输出:

           group param  distinct_count
        0      1     a             2.0
        1      1     a             2.0
        2      2     b             1.0
        3      3   NaN             NaN
        4      3     a             2.0
        5      3     a             2.0
        6      4   NaN             NaN
        

        并检查@jezrael 的组数。

        print (df.groupby('param')['group'].nunique())
        
        param
        a    2
        b    1
        Name: group, dtype: int64
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-26
          • 1970-01-01
          • 1970-01-01
          • 2023-04-11
          相关资源
          最近更新 更多