繁体   English   中英

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

[英]Count occurrences of certain values in dask.dataframe

我有这样的数据帧:

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  

并想知道某些resource_records存在多少次。

我的第一次尝试是使用value_counts()返回的系列,这看起来很棒,但之后不允许我排除一些标签,因为在dask.Series没有实现drop()

所以我试着不打印不需要的标签:

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]))

哪个工作正常,但如果我想进一步处理这些数据并真的希望它“清理”怎么办? 所以我搜索了一些文档并找到了mask() ,但这也有点笨拙:

records = df.resource_record.mask(df.resource_record.map(lambda x: x in ['AAAA'])).value_counts()

我找了一个允许我只计算单个值的方法,但count()会计算所有不是NaN的值。

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

print(df.resource_record.str.contains('A').sum())

输出:

dd.Scalar<series-..., dtype=int64>

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

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

在大多数情况下,pandas语法也可以与dask一起使用,必须添加.compute() (或dask.compute )来实际执行操作。 在计算之前,您只是构建定义动作的图形。

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

df[df.resource_record!='AAAA'].resource_record.value_counts().compute()

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

我找到的一个非常好的方法是:

counts = df.resource_record.mask(df.resource_record.isin(['AAAA'])).dropna().value_counts()

首先,我们屏蔽我们要删除的所有条目,这将用NaN替换该值。 然后我们使用NaN删除所有行,并最后计算唯一值的出现次数。

这要求df不具有NaN值,否则会导致包含NaN的行也被除去。

我期待类似的东西

df.resource_record.drop(df.resource_record.isin(['AAAA']))

会更快,因为我相信drop会在数据集中运行一次,而mask + dropna会在数据集中运行两次。 但是drop仅针对axis = 1实现,这里我们需要axis = 0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM