我有一个这样的数据框:
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我也没有找到获得其价值的方法。
您如何有效地计算数据框中某组值的出现?
在大多数情况下,pandas语法也可以与dask配合使用,并需要添加.compute()(或dask.compute)以实际执行操作。在进行计算之前,您仅在构建定义动作的图形。
我相信最简单的解决方案是:
df[df.resource_record!='AAAA'].resource_record.value_counts().compute()
Run Code Online (Sandbox Code Playgroud)
选择器方括号中的表达式可能是某些映射或函数。