熊猫:为groupby标识的每个组分配一个索引

新手上路,请多包涵

使用 groupby() 时,如何使用包含组号索引的新列创建 DataFrame,类似于 dplyr::group_indices 在 R 中。例如,如果我有

>>> df=pd.DataFrame({'a':[1,1,1,2,2,2],'b':[1,1,2,1,1,2]})
>>> df
   a  b
0  1  1
1  1  1
2  1  2
3  2  1
4  2  1
5  2  2

我怎样才能得到像

   a  b  idx
0  1  1  1
1  1  1  1
2  1  2  2
3  2  1  3
4  2  1  3
5  2  2  4

idx 索引的顺序无关紧要)

原文由 user2667066 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 452
2 个回答

这是使用 drop_duplicatesmerge 获取唯一标识符的简洁方法。

 group_vars = ['a','b']
df.merge( df.drop_duplicates( group_vars ).reset_index(), on=group_vars )

   a  b  index
0  1  1      0
1  1  1      0
2  1  2      2
3  2  1      3
4  2  1      3
5  2  2      5

在这种情况下,标识符变为 0,2,3,5(只是原始索引的残差),但这可以很容易地更改为 0,1,2,3 和附加的 reset_index(drop=True)

更新: 较新版本的熊猫 (0.20.2) 提供了一种更简单的方法来使用 ngroup 方法,如@Constantino 对上述问题的评论和@CalumYou 的后续回答所述。我将把它留在这里作为替代方法,但 ngroup 在大多数情况下似乎是更好的方法。

原文由 JohnE 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是使用 ngroup 的解决方案(从 pandas 0.20.2 开始可用)来自 Constantino 上面的评论

 import pandas as pd
df = pd.DataFrame({'a':[1,1,1,2,2,2],'b':[1,1,2,1,1,2]})
df['idx'] = df.groupby(['a', 'b']).ngroup()
df

    a  b  idx
0  1  1    0
1  1  1    0
2  1  2    1
3  2  1    2
4  2  1    2
5  2  2    3

原文由 Calum You 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题