计算 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()
返回的系列,这看起来不错,但之后不允许我排除一些标签,因为在 [=19= 中没有实现 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]))
效果很好,但如果我想进一步处理这些数据并且真的想要它怎么办 'cleaned'。所以我多搜索了一下文档,发现 mask()
,但这也感觉有点笨拙:
records = df.resource_record.mask(df.resource_record.map(lambda x: x in ['AAAA'])).value_counts()
我在寻找一种方法,它可以让我只计算单个值,但是 count()
确实计算了所有不是 NaN 的值。
然后我找到了 str.contains()
,但我不知道如何处理我用这段代码返回的未记录的标量类型:
print(df.resource_record.str.contains('A').sum())
输出:
dd.Scalar<series-..., dtype=int64>
但即使查看了 dask/dataframe/core.py
中 Scalar 的代码,我也没有找到获取其值的方法。
您如何有效地计算数据框中特定值集的出现次数?
我发现的一个很好的方法是:
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 运行s 通过数据集两次。但是drop只针对axis=1实现,这里需要axis=0.
在大多数情况下,pandas 语法与 dask 一样有效,需要添加 .compute()
(或 dask.compute
)以实际执行操作。在计算之前,您只是在构建定义操作的图表。
我认为解决您问题的最简单方法是:
df[df.resource_record!='AAAA'].resource_record.value_counts().compute()
选择器方括号中的表达式可以是某个映射或函数。
我有一个这样的数据框:
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()
返回的系列,这看起来不错,但之后不允许我排除一些标签,因为在 [=19= 中没有实现 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]))
效果很好,但如果我想进一步处理这些数据并且真的想要它怎么办 'cleaned'。所以我多搜索了一下文档,发现 mask()
,但这也感觉有点笨拙:
records = df.resource_record.mask(df.resource_record.map(lambda x: x in ['AAAA'])).value_counts()
我在寻找一种方法,它可以让我只计算单个值,但是 count()
确实计算了所有不是 NaN 的值。
然后我找到了 str.contains()
,但我不知道如何处理我用这段代码返回的未记录的标量类型:
print(df.resource_record.str.contains('A').sum())
输出:
dd.Scalar<series-..., dtype=int64>
但即使查看了 dask/dataframe/core.py
中 Scalar 的代码,我也没有找到获取其值的方法。
您如何有效地计算数据框中特定值集的出现次数?
我发现的一个很好的方法是:
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 运行s 通过数据集两次。但是drop只针对axis=1实现,这里需要axis=0.
在大多数情况下,pandas 语法与 dask 一样有效,需要添加 .compute()
(或 dask.compute
)以实际执行操作。在计算之前,您只是在构建定义操作的图表。
我认为解决您问题的最简单方法是:
df[df.resource_record!='AAAA'].resource_record.value_counts().compute()
选择器方括号中的表达式可以是某个映射或函数。