有没有办法在dask中获得每组最大的项目?

whi*_*eam 7 grouping top-n pandas dask

我有以下数据集:

location  category    percent
A         5           100.0
B         3           100.0
C         2            50.0
          4            13.0
D         2            75.0
          3            59.0
          4            13.0
          5             4.0
Run Code Online (Sandbox Code Playgroud)

而我正试图在按位置分组的数据框中获取最大类别的项目.即如果我想要每组的前2个最大百分比,输出应该是:

location  category    percent
A         5           100.0
B         3           100.0
C         2            50.0
          4            13.0
D         2            75.0
          3            59.0
Run Code Online (Sandbox Code Playgroud)

看起来在熊猫中这是相对直接的使用,pandas.core.groupby.SeriesGroupBy.nlargest但是dask没有nlargestgroupby的功能.一直在玩,apply但似乎无法让它正常工作.

df.groupby(['location'].apply(lambda x: x['percent'].nlargest(2)).compute()

但我只是得到错误 ValueError: Wrong number of items passed 0, placement implies 8

And*_*den 3

apply 应该可以工作,但是你的语法有点不对:

In [11]: df
Out[11]:
Dask DataFrame Structure:
              Unnamed: 0 location category  percent
npartitions=1
                   int64   object    int64  float64
                     ...      ...      ...      ...
Dask Name: from-delayed, 3 tasks

In [12]: df.groupby("location")["percent"].apply(lambda x: x.nlargest(2), meta=('x', 'f8')).compute()
Out[12]:
location
A         0    100.0
B         1    100.0
C         2     50.0
          3     13.0
D         4     75.0
          5     59.0
Name: x, dtype: float64
Run Code Online (Sandbox Code Playgroud)

在 pandas 中,您可以使用.nlargest.rank作为 groupby 方法,这可以让您在不应用的情况下执行此操作:

In [21]: df1
Out[21]:
  location  category  percent
0        A         5    100.0
1        B         3    100.0
2        C         2     50.0
3        C         4     13.0
4        D         2     75.0
5        D         3     59.0
6        D         4     13.0
7        D         5      4.0

In [22]: df1.groupby("location")["percent"].nlargest(2)
Out[22]:
location
A         0    100.0
B         1    100.0
C         2     50.0
          3     13.0
D         4     75.0
          5     59.0
Name: percent, dtype: float64
Run Code Online (Sandbox Code Playgroud)

dask 文档注释

Dask.dataframe 涵盖了 pandas API 的一小部分但常用的部分。
这种限制有两个原因:

  1. pandas API 非常庞大
  2. 有些操作确实很难并行执行(例如排序)。