【问题标题】:How to get a column of group id values for a pandas DataFrame based on the groups produced by a groupby operation如何根据 groupby 操作生成的组获取 pandas DataFrame 的组 ID 值列
【发布时间】:2019-08-24 23:58:35
【问题描述】:

我有一个 DataFrame,我想用几列 groupby。我知道之后如何聚合数据,或者查看每个索引元组。但是,我不确定将每个组的“组号”附加到原始数据框的列中的最佳方法:

例如,我有一个数据框 df,有两个索引(a_idb_id),我想将它们用于使用 groupbydf 进行分组。

import pandas as pd
a = pd.DataFrame({'a_id':['q','q','q','q','q','r','r','r','r','r'],
                  'b_id':['m','m','j','j','j','g','g','f','f','f'],
                  'val': [1,2,3,4,5,6,7,8,9,8]})

# Output:
  a_id b_id  val
0    q    m    1
1    q    m    2
2    q    j    3
3    q    j    4
4    q    j    5
5    r    g    6
6    r    g    7
7    r    f    8
8    r    f    9
9    r    f    8

当我进行 groupby 时,我不想聚合所有内容,我只想添加一个列 group_id,其中包含一个表示组的整数。但是,我不确定是否有一种简单的方法可以做到这一点。我当前的解决方案包括反转 GroupBy.indices 字典,将其转换为系列,并将其附加到数据框中,如下所示:

gb = a.groupby(['a_id','b_id'])
dict_g = dict(enumerate(gb.indices.values()))
dict_g_reversed = {x:k for k,v in dict_g.items() for x in v}
group_ids = pd.Series(dict_g_reversed)
a['group_id'] = group_ids

尽管group_id 索引的顺序不正确,但这给了我想要的东西。这似乎应该是一个简单的功能,但我不确定为什么它似乎不是。例如,我知道在 MATLAB 中,他们有一个 findgroups,它完全符合我的要求。到目前为止,我还没有在 pandas 中找到等价物。如何使用 pd DataFrame 完成此操作?

【问题讨论】:

  • 你能提供你预期输出的 sn-p 吗?

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

您可以使用ngroup 这将提供作为发生的顺序

a.groupby(['a_id','b_id']).ngroup()

或使用factorize

pd.factorize(list(map(tuple,a[['a_id','b_id']].values.tolist())))[0]+1
df['newid']=pd.factorize(list(map(tuple,a.values.tolist())))[0]+1

【讨论】:

  • 我不敢相信我错过了 ngroups。感谢您指出。
猜你喜欢
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2021-06-05
  • 2020-03-09
  • 2022-01-19
相关资源
最近更新 更多