- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个有组的 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/
我是一名优秀的程序员,十分优秀!