我在基于我想要的列的数据框上使用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)
这里的数据框只是一个例子。
有没有办法使用grouped_by
来实现这个目标?
答案 0 :(得分:2)
这是一个使用cumcount()
对虚拟变量生成每个组的项目索引的解决方案。它应该明显更快。
In [122]: df['dummy'] = 0
...: df["POS"] = df.groupby(['A','B','C'])['dummy'].cumcount()
...: df = df.drop('dummy', axis=1)
正如@unutbu所说,即使使用更清洁:
df["POS"] = df.groupby(['A','B','C']).cumcount()