我有一个看起来很简单的问题:在 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
似乎未对齐。请问有人知道如何解决这个问题吗?
实际上,当查看代码的作用时,顺序并不那么令人惊讶。
从一个较小的示例开始有助于实际了解您在做什么。
您的排序取决于您的
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 数据帧的分区,索引不同(...?)