我根据我想要的列在数据帧上使用 groupby,然后我必须获取其组中每个项目的索引。我所说的索引是指,如果一组中有 10 个项目,则索引从 0 到 9,而不是数据帧索引。
我执行此操作的代码如下:
import pandas as pd
df = pd.DataFrame({'A': np.random.randint(0, 11, 10 ** 3), 'B': np.random.randint(0, 11, 10 ** 3),
'C': np.random.randint(0, 11, 10 ** 3), 'D': np.random.randint(0, 2, 10 ** 3)})
grouped_by = df.groupby(["A", "B", "C"])
groups = dict(list(grouped_by))
index_dict = {k: v.index.tolist() for k,v in groups.items()}
df["POS"] = df.apply(lambda x: index_dict[(x["A"], x["B"], x["C"])].index(x.name), axis=1)
Run Code Online (Sandbox Code Playgroud)
这里的数据框只是一个例子。
有没有办法使用grouped_by来实现这一目标?
这是一个使用cumcount()虚拟变量为每个组生成项目索引的解决方案。它也应该明显更快。
In [122]: df['dummy'] = 0
...: df["POS"] = df.groupby(['A','B','C'])['dummy'].cumcount()
...: df = df.drop('dummy', axis=1)
Run Code Online (Sandbox Code Playgroud)
正如@unutbu 指出的,使用起来更干净:
df["POS"] = df.groupby(['A','B','C']).cumcount()
Run Code Online (Sandbox Code Playgroud)