id ord a1 a2 a3
-- --- -- --- ------
1 1 44 2.3 banana
1 3 21 2.3 banana
1 2 21 2.3 banana <- mangle should drop this one
2 1 ...
...
我的目标是,在每个组(由索引id
标识)中,按ord
排序,连续删除&#34;不变&#34;行。我的第一次尝试是groupby.apply
类型的解决方案需要几个小时。
我转向map_partitions
,但无法解释为什么这种情况发生得非常慢。在单个Dask分区上,单个核心(约200k行)需要2秒钟。在64核机器(总共约500个分区)上通过dask数据帧进行映射需要大约10000次!
def mangle(df):
# Input dask dataframe is sorted on index, keep it that way
df = df.sort_values(['ord']).sort_index(level=0, sort_remaining=False, kind='mergesort')
mask = (
df.drop(columns=['ord']).groupby(df.index).fillna(-999).shift(1) == \
df.drop(columns=['ord']).groupby(df.index).fillna(-999).shift(0)
).all(axis=1)
df = df[~mask]
return df.groupby(df.index).fillna(method='backfill')