当前位置: 首页 > 面试题库 >

使用pandas groupby计算唯一值

崔高远
2023-03-14
问题内容

我有以下形式的数据:

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

我敢肯定,有一种方法可以更干净地执行此操作,而无需使用循环,但是我似乎无法解决问题。任何帮助将非常感激。


问题答案:

我认为您可以使用SeriesGroupBy.nunique

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

的另一种解决方案unique,然后创建new
dfby DataFrame.from_records,将其重塑为Seriesbystack和last
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


 类似资料:
  • 问题内容: 我需要在每笔 数据中都计算唯一值 我尝试 但是我想得到 问题答案: 您需要: 如果需要字符: 或正如乔恩所说: 您可以像这样保留列名: 区别在于返回一个Series并返回一个DataFrame。

  • 问题内容: 如果我有三列: 我想计算一下表格中有多少唯一的电子邮件,我该怎么做? 如下语句: 给我总数。 我试过了 但这似乎并没有给我期望的数字。 问题答案: 采用 提供唯一的电子邮件ID,然后简单地对其进行计数。

  • 问题内容: 更新 :已添加 我想对我的ElasticSearch集群执行唯一计数。该集群包含约5000万条记录。 我尝试了以下方法: 第一种方法 在本节中提到: 预计算哈希通常仅在非常大和/或高基数的字段上有用,因为它可以节省CPU和内存。 第二种方法 在本节中提到: 除非您将Elasticsearch配置为使用doc_values作为字段数据格式,否则使用聚合和构面对堆空间的要求 非常 高。 我

  • 问题内容: 我有以下json 我想计算重复的名字 重复计数3 不可重复的名字计数 非重复计数2 我试图计算存储桶的数量,但似乎计算所有存储桶是重复的还是非重复的 问题答案: 好吧,我在这里利用了几种聚合。以下是我使用过的列表。列表的顺序是聚合的执行顺序。 对于重复 术语汇总 统计数据桶汇总 对于非重复 术语汇总 桶选择器 (作为子集合) 总和桶选择器 汇总查询: 响应 注意,在上面的响应中,我们有

  • 问题内容: 我已经在处理以下代码,但是似乎找不到一种方法来计算字谜列表中唯一值的数量。如果我只是打印出:我会得到列表的总价值,但其中包括重复项。 我试图将列表转换为集合,然后再删除掉重复项,但是还没有任何运气。 谢谢! 问题答案: 使用。仅包含唯一值:

  • 问题内容: 到目前为止,我的代码是这样的: 我想添加一个代码,该代码可以计算来自模式(此路径中的42个txt文件)中的唯一单词,但我不知道该怎么做。有谁能够帮助我? 问题答案: 在Python中计算对象的最佳方法是使用为此目的而创建的类。它的行为类似于Python字典,但计数时使用起来稍微容易一些。您只需传递对象列表,它就会自动为您计数。 Counter也有一些有用的方法,例如most_commo