我有一个这样的数据框:
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()
返回的系列,这似乎很棒,但之后不允许我排除某些标签,因为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]))
哪种方法很好,但是如果我想进一步处理这些数据并且真的希望它能够清理干净怎么办?所以我更多地搜索了文档并找到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代码之后,我也找不到获取其价值的方法。
您如何有效地计算数据框中某组值的出现次数?
答案 0 :(得分:5)
在大多数情况下,pandas语法也可以与dask一起使用,必须添加$('[data-foo]').on('click', '.button-action', function() {
console.log($(this).parent())
});
(或.compute()
)来实际执行操作。在计算之前,您只是构建定义动作的图形。
我相信你问题最简单的解决方案是:
dask.compute
选择器方括号中的表达式可以是某些映射或函数。
答案 1 :(得分:1)
我找到的一个非常好的方法是:
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。