我有一个 DataFrame,我想要 groupby
有几列。我知道如何聚合数据,或者查看每个索引元组。但是,我不确定将每个组的“组号”附加到原始数据帧的列中的最佳方法:
例如,我有一个数据框,df
,有两个索引( a_id
和 b_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/