Python 熊猫:创建一个从1到每组长度的列

Python 熊猫:创建一个从1到每组长度的列,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个有组的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)+

我有一个有组的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))
或者,如果我尝试返回
系列
对象,如中所示:

df["c"] = df.groupby("id").apply(lambda x: pd.Series(data = np.arange(1, len(x)+1)))
这引发了一个异常,表示索引不兼容(这是有意义的,因为返回的
系列
现在有一个
多索引

更新:让我把这个问题更概括一点:如何对返回与数据帧具有相同索引的
序列的数据帧执行
groupby
,以便将生成的序列合并到原始数据帧中

df["c"] = 1 + df.groupby("id").cumcount()
解决方案不起作用的原因是groupby&agg试图为每个组创建结果,而不是为每个行创建结果。因此,下面为每个组创建一个数字列表

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

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

对于更一般的需求,您可能需要查看
滚动/重采样
功能


让我把这个问题说得更笼统一点:一个人怎么做groupby 在返回与数据帧具有相同索引的序列的数据帧上 以便生成的序列可以合并到原始序列中 数据帧

df["c"] = 1 + df.groupby("id").cumcount()
您需要
groupby+transform
。但它不适用于像这样的累积操作案例。实际上可以,如@Alex answer所示

df["c"] = df.groupby("id")["a"].transform(lambda x: np.arange(1, len(x)+1))
解决方案不起作用的原因是groupby&agg试图为每个组创建结果,而不是为每个行创建结果。因此,下面为每个组创建一个数字列表

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

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

对于更一般的需求,您可能需要查看
滚动/重采样
功能


让我把这个问题说得更笼统一点:一个人怎么做groupby 在返回与数据帧具有相同索引的序列的数据帧上 以便生成的序列可以合并到原始序列中 数据帧

df["c"] = 1 + df.groupby("id").cumcount()
您需要
groupby+transform
。但它不适用于像这样的累积操作案例。实际上可以,如@Alex answer所示

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

以下是一个相当普遍的正确方法:

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

以下是一个相当普遍的正确方法:

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

这解决了问题,但范围很窄。如果我想把数字倒过来或是做些什么。。如果可能,请提供更一般的解决方案。感谢您的回答,请查看更新的问题。同样,我想为每个组返回一个序列,然后将其合并回数据帧。滚动/重采样不适用于此上下文
groupby
+
transform
是正确的解决方案。我会把它作为答案发布,如果你想编辑你的答案,我会接受,因为你有这个想法,实际上我不知道我们可以像那样使用
transform
。所以,请随意接受你自己的解决方案。你有这个想法,所以我不介意给你荣誉(并学到了一些新的东西,像我一样),这解决了问题,但范围很窄。如果我想把数字倒过来或是做些什么。。如果可能,请提供更一般的解决方案。感谢您的回答,请查看更新的问题。同样,我想为每个组返回一个序列,然后将其合并回数据帧。滚动/重采样不适用于此上下文
groupby
+
transform
是正确的解决方案。我会把它作为答案发布,如果你想编辑你的答案,我会接受,因为你有这个想法,实际上我不知道我们可以像那样使用
transform
。所以,请随意接受你自己的解决方案。你有这个想法,所以我不介意给你荣誉(并且学到了一些新的东西,比如我)