我有以下数据集:
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
答案 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
Dask.dataframe涵盖了pandas API的一小部分但很常用的部分 这种限制有两个原因:
- pandas API很大
- 有些操作真的很难并行(例如排序)。
醇>