python - 如何根据 groupby 操作生成的组获取 pandas DataFrame 的一列组 id 值

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

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

例如,我有一个数据框,df ,有两个索引( a_idb_id ),我想用它们对 df 进行分组使用groupby .

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

当我进行分组时,我只想添加一列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 来完成此操作?

最佳答案

您可以使用ngroup这将提供出现次数的顺序

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

或者使用分解

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

关于python - 如何根据 groupby 操作生成的组获取 pandas DataFrame 的一列组 id 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57642294/

相关文章:

python - 删除字典中的键/值对不起作用

python - 将 Matlab 矩阵串联转换为 Python

python - 猴子在 Python 中修补 __eq__

Python pandas 时间序列,标题下有空白区域

python - 使用带有稀疏 scipy 矩阵的广播

python - 在 Pandas Dataframe 中聚合、转置和提取值

python - Python 中的 for 循环问题中的 Tkinter 按钮

python - 分类数据是/否到 0/1 python - 这是正确的方法吗?

python - 运行 Pairwise Distance 函数后如何维护或恢复 Dataframe 索引?

python - 根据相应的 numpy 数组值分割 Dataframe