gpt4 book ai didi

python - Pandas :创建一个从 1 到每组长度的列

转载 作者:太空宇宙 更新时间:2023-11-04 09:43:45 25 4
gpt4 key购买 nike

我有一个有组的 df。对于每个组,我想形成一个新列,其中包含从 1 到该组中行数的整数。以下尝试不起作用,因为它创建的是一行多列而不是一列多行。为什么会这样?

df = pd.DataFrame(data = {"a": np.arange(5), "b": np.arange(5)[::-1], "id": [1,1,1,2,2]}).set_index("id")
df["c"] = df.groupby("id").apply(lambda x: np.arange(1, len(x)+1))

或者,如果我尝试返回一个 Series 对象,如下所示:

df["c"] = df.groupby("id").apply(lambda x: pd.Series(data = np.arange(1, len(x)+1)))

这引发了一个异常,指出索引不兼容(这是有道理的,因为返回的 Series 现在有一个 MultiIndex)

更新:让我把这个问题问得更笼统一些:如何对一个数据帧执行 groupby 并返回具有相同的 Series索引作为数据框,以便可以将结果系列合并到原始数据框中?

最佳答案

df["c"] = 1 + df.groupby("id").cumcount()

您的解决方案不起作用的原因是 groupby 和 agg 尝试为每个 group 而不是每个 row 创建一个结果。所以下面为每个组创建一个数字列表

df.groupby("id").apply(lambda x: np.arange(1, len(x)+1))

对于您的评论:要使数字反转,您可以执行groupby - sort - cumcount

对于更一般的需求,您可能需要查看rolling/resample 函数。


Let me make this question a bit more general: how does one do groupby on a dataframe returning a Series with the same index as the dataframe so that the resulting series can be merged into the original dataframe?

你需要groupby + transform但它不适用于像这样的累积操作情况。实际上它可以,如@Alex answer所示

df["c"] = df.groupby("id")["a"].transform(lambda x: np.arange(1, len(x)+1))

关于python - Pandas :创建一个从 1 到每组长度的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50634224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com