Python 少于55个键,其余单元格将包含NaN值)。 这意味着在应用于数据帧之后,该数据帧的列将被命名为0、1、2、…、54

Python 少于55个键,其余单元格将包含NaN值)。 这意味着在应用于数据帧之后,该数据帧的列将被命名为0、1、2、…、54,python,pandas,dask,Python,Pandas,Dask,现在,使用数据集将函数映射到每个分区,并在每个分区中使用应用将其应用到数据帧 #Dask dd.from_pandas(dataset,npartitions=nCores).\ map_partitions( lambda df : df.apply( lambda x : func(x.post,New_DF),axis=1)).\ compute(get=get) map\u分区需要一个函数,该函数将数据帧作为输入并输出数据帧。您的函数是通过使用l

现在,使用
数据集
将函数映射到每个分区,并在每个分区中使用
应用
将其应用到
数据帧

#Dask 
dd.from_pandas(dataset,npartitions=nCores).\
 map_partitions(
      lambda df : df.apply(
         lambda x : func(x.post,New_DF),axis=1)).\
   compute(get=get)
map\u分区
需要一个函数,该函数将数据帧作为输入并输出数据帧。您的函数是通过使用lambda函数来实现的,lambda函数基本上调用其他函数并将其应用于数据帧,而数据帧又返回一个数据帧。这是可行的,但我强烈建议编写一个命名函数,将数据帧作为输入并输出数据帧,这样可以更容易地调试代码

例如,使用以下简单的包装函数:

df_wise(df):
    return df.apply(tobsecret_func)
尤其是当你的代码变得越来越复杂,避免使用调用非平凡代码(如自定义
func
)的
lambda
函数,而是创建一个简单的命名函数可以帮助您进行调试,因为回溯不仅会将您引导到一行,其中包含一组lambda函数(如代码中的lambda函数),而且还会直接指向命名函数
df_wise
,这样您就可以准确地看到错误的来源

#Dask 
dd.from_pandas(dataset,npartitions=nCores).\
 map_partitions(df_wise, 
                meta=df_wise(dd.head())
                ).\
   compute(get=get)
请注意,我们刚刚将
dd.head()
输入到
df_-wise
来创建我们的meta关键字,这与Dask在引擎盖下的工作类似

您使用的是同步调度程序dask.get,这就是为什么整个新的_DF.append(…)代码可以工作的原因,因为您可以为每个连续分区追加数据帧

这不会给您任何并行性,因此,如果您使用其他调度器之一(所有这些调度器都将并行化您的代码),则无法工作


还提到了
meta
关键字参数,您应该将该参数提供给
map_分区
调用,以便dask知道您的数据帧将有哪些列。如果不这样做,dask将首先在其中一个分区上试运行函数,并检查输出的形状,然后才能继续执行其他分区。如果你的分区很大,这会使你的代码慢很多;给出
meta
关键字可以避免对dask进行不必要的计算。

感谢您详细的回答,您的回答突出了我的知识不足,因此我回到了dask的基础知识上来复习。在我完全理解map_分区的情况之前,我不会接受答案。对不起!嘿,希望这有帮助,不要太粗鲁。如果您需要更多的澄清,请让我知道!达斯克有它自己的一些规则,如果你不能很快直觉,不要感到难过——我也没有。不,不是!这是一个非常合适的回答!我已经对此进行了更多的研究,根据这个[question](),在我需要的每个分区中,外部函数只会按行调用一次。我可以尝试改用.map,但随后我遇到了返回多个值/列的问题。最后,我不确定Dask是否真的适合这个任务,除非你能想到我遗漏了什么?我在回答中暗示了这一点-你使用map_分区的方式应该可以很好地工作(除了
新的DF.append
逻辑和你的func返回可变长度
pd.Series
)。我将添加一个编辑,我将如何重新考虑您的代码。干杯,这样我就“理解”了,甚至可以将dd.head()传递给meta。我理解逻辑,但这会引发一个错误,即dask.dataframe没有属性头。这表明dd可能是不正确的?另外,您是否知道允许合并并行的dask.get替代方案?谢谢你的帮助和更多的细节回复!谢谢你详细的回答,你的回答突出了我的知识不足,所以我回到达斯克基础来复习。在我完全理解map_分区的情况之前,我不会接受答案。对不起!嘿,希望这有帮助,不要太粗鲁。如果您需要更多的澄清,请让我知道!达斯克有它自己的一些规则,如果你不能很快直觉,不要感到难过——我也没有。不,不是!这是一个非常合适的回答!我已经对此进行了更多的研究,根据这个[question](),在我需要的每个分区中,外部函数只会按行调用一次。我可以尝试改用.map,但随后我遇到了返回多个值/列的问题。最后,我不确定Dask是否真的适合这个任务,除非你能想到我遗漏了什么?我在回答中暗示了这一点-你使用map_分区的方式应该可以很好地工作(除了
新的DF.append
逻辑和你的func返回可变长度
pd.Series
)。我将添加一个编辑,我将如何重新考虑您的代码。干杯,这样我就“理解”了,甚至可以将dd.head()传递给meta。我理解逻辑,但这会引发一个错误,即dask.dataframe没有属性头。这表明dd可能是不正确的?另外,您是否知道允许合并并行的dask.get替代方案?谢谢你的帮助和更多的细节回复!
#Dask 
dd.from_pandas(dataset,npartitions=nCores).\
 map_partitions(
      lambda df : df.apply(
         lambda x : func(x.post,New_DF),axis=1)).\
   compute(get=get)
df_wise(df):
    return df.apply(tobsecret_func)
#Dask 
dd.from_pandas(dataset,npartitions=nCores).\
 map_partitions(df_wise, 
                meta=df_wise(dd.head())
                ).\
   compute(get=get)