看起来我遗漏了一些关于如何在 Dask 中使用 DataFrame 索引的非常基本的东西。
我有一个 DataFrame,其中大部分排序和过滤都是在列
date
上完成的,所以下面
https://docs.dask.org/en/stable/dataframe-best-practices.html
具体
Dask DataFrame 可以选择性地沿着单个索引列进行排序。 针对此列的某些操作可能非常快。例如,如果 您的数据集按时间排序,您可以快速选择数据 特定的一天,执行时间序列连接等。
我决定把索引设为
date
。我很困惑是否有多个具有相同值的索引(即在同一确切日期的多个观测值)是否会构成问题,但文档暗示相反,我没有看到任何针对重复索引的警告,我继续并用重新索引我的DataFrame
cur_df = cur_df.set_index('date', sorted=True)
然后我需要创建一个新专栏,我做了它
to_date_diff = lambda x : (x - cur_date).days/365
to_date_diff_meta = pd.Series([], dtype=float, name='date_diff')
cur_df['date_diff'] = cur_df['final_date'].apply(to_date_diff, meta=to_date_diff_meta).compute()
但是我得到了错误
ValueError: cannot reindex on an axis with duplicate labels
所以我现在必须重新索引所有内容吗?哎呀!我希望在重新索引我所有的 DataFrame 之前知道!如果我仍然想对列“date”执行“非常快”的操作,但它不能作为索引,因为它有重复的值怎么办?
===编辑===
糟糕的是,我意识到问题不在于索引,而在于我最后一行的
.compute()
。
问题仍然存在: 我是否应该重新索引我的 DataFrame(具有唯一索引?我什至不确定唯一索引在 Dask 中是否存在,因为不同的分区会始终从 0 开始重置它们的索引)或不(具有以某种方式干扰多个索引)? 我希望它在某处指定,我只是在文档中找不到任何明确的提示。
这种问题经常出现,您可能会发现使用 map_partitions 函数操作更容易,将您的 pandas 操作封装在一个步骤中
def map_me(df):
to_date_diff = lambda x : (x - cur_date).days/365
df['date_diff'] = df['final_date'].apply(to_date_diff)
out = cur_df.map_partitions(map_me, meta=...)
提供
meta
是可选的。