Dask 数据框中的简单转换会产生意想不到的结果

问题描述 投票:0回答:1

我有一个看起来很简单的问题:在 Dask 数据框中,我需要为每组添加一列的累积最小值。我的数据框如下所示:

import pandas as pd
import numpy as np
import dask.dataframe as dd


df = pd.DataFrame(np.random.randint(0, 100, size=(100000, 4)), columns=list("ABCD"))
df["id"] = np.random.choice(["a", "b", "c", "d", "e"], 100000)
df["col"] = np.random.choice(["X", "Y", "Z", "G"], 100000)

df = dd.from_pandas(df, npartitions=2)
df = df.set_index("id")

现在我想向

df
添加一列,其中包含按列
A
分组的列
col
的累积(“运行”)最小值。我尝试过以下方法:

res = df.groupby("col")["A"].transform("cummin", meta = ("a", "f8")).compute()

但是当我将结果与应有的结果进行比较时:

res
df.compute()

两者的不同之处在于

res
似乎未对齐。请问有人知道如何解决这个问题吗?

python dask
1个回答
0
投票

实际上,当查看代码的作用时,顺序并不那么令人惊讶。

从一个较小的示例开始有助于实际了解您在做什么。

您的排序取决于您的

groupby
...

组中的排序
import pandas as pd
import numpy as np
import dask.dataframe as dd


df = pd.DataFrame(np.random.randint(0, 100, size=(10, 4)), columns=list("ABCD"))
df["id"] = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]  # unique ids...
df["col"] = np.random.choice(["X", "Y"], 10)

df = dd.from_pandas(df, npartitions=2)

groupby
得出以下指数 (
df.compute().groupby("col").groups
):

{'X': [0, 2, 5, 7, 9], 'Y': [1, 3, 4, 6, 8]}

以下三个命令和生成的索引(和图像)应该可以清除该行为。 请注意索引的顺序以及 Groupby 在 DataFrame 的哪个部分!

res = df[["A", "col"]].groupby("col").transform("cummin", meta={'A': 'f8'}).compute()  # AX

res2 = df.groupby("col")["A"].transform("cummin", meta = ("A-Question", "f8")).compute()  # your solution -> AQ

res3 = df[["A", "col"]].groupby("col")['A'].transform("cummin", meta= ("A2", "f8"))  # AY

我不确定为什么

AQ
AY
不同,但也许由于 dask 数据帧的分区,索引不同(...?)

© www.soinside.com 2019 - 2024. All rights reserved.