计算dask.dataframe中某些值的出现

vol*_*orn 3 python dask

我有一个这样的数据框:

df.head()
   day      time  resource_record  
0   27  00:00:00             AAAA  
1   27  00:00:00                A  
2   27  00:00:00             AAAA  
3   27  00:00:01                A  
4   27  00:00:02                A  
Run Code Online (Sandbox Code Playgroud)

并想找出某些resource_records事物的存在次数。

我的第一个尝试是使用by返回的Series value_counts(),这看起来不错,但是由于以后没有drop()在中实现,因此我不允许以后再排除一些标签dask.Series

因此,我尝试不打印不需要的标签:

for row in df.resource_record.value_counts().iteritems():
    if row[0] in ['AAAA']:
        continue
    print('\t{0}\t{1}'.format(row[1], row[0]))
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但是如果我想进一步处理此数据并真的希望“清除”该怎么办。因此,我对文档进行了更多搜索并找到了mask(),但这也有些笨拙:

records = df.resource_record.mask(df.resource_record.map(lambda x: x in ['AAAA'])).value_counts()
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法,该方法将允许我仅对单个值进行计数,但count()对所有非NaN值进行计数。

然后我找到了str.contains(),但是我不知道如何处理使用以下代码返回的未记录的Scalar类型:

print(df.resource_record.str.contains('A').sum())
Run Code Online (Sandbox Code Playgroud)

输出:

dd.Scalar<series-..., dtype=int64>
Run Code Online (Sandbox Code Playgroud)

但是即使在查看了Scalar的代码之后,dask/dataframe/core.py我也没有找到获得其价值的方法。

您如何有效地计算数据框中某组值的出现?

mdu*_*ant 5

在大多数情况下,pandas语法也可以与dask配合使用,并需要添加.compute()(或dask.compute)以实际执行操作。在进行计算之前,您仅在构建定义动作的图形。

我相信最简单的解决方案是:

df[df.resource_record!='AAAA'].resource_record.value_counts().compute()
Run Code Online (Sandbox Code Playgroud)

选择器方括号中的表达式可能是某些映射或函数。