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

时间:2017-11-10 17:06:44

标签: pandas grouping dask top-n

我有以下数据集:

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

我正在尝试按位置分组数据框中的最大类别项目。即如果我想要每组的前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

在pandas中看起来使用pandas.core.groupby.SeriesGroupBy.nlargest这是相对简单的,但是dask对于groupby没有nlargest函数。一直在玩apply,但似乎无法让它正常工作。

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

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

1 个答案:

答案 0 :(得分:3)

应用应该有效,但你的语法有点偏差:

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

在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

The dask documentation notes

  

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

     
      
  1. pandas API很大
  2.   
  3. 有些操作真的很难并行(例如排序)。
  4.