有没有一种方法可以按熊猫中的一组列值进行唯一分组?

时间:2020-06-25 21:50:19

标签: python pandas dataframe pandas-groupby

我有一个数据框,其中包含五列ID值和一些任意度量。 ID值与特定项目的5名员工相关,但是对于将每个ID输入到数据集中的顺序没有标准。我想对5个ID的集合执行groupby以便在组级别进行评估。

INSERT INTO Liked_Movies (user_name, time_of_entry, movie_name, foo)
SELECT username, NOW(), m.movie_name, 'foo' FROM movies m

但是,由于原始数据集中ID的排序不唯一,如果我按5个ID进行分组,则实际上只有两个唯一组时,我将得到3个分组。

In[1]: df1 = pd.DataFrame({'ID_1' : [1, 1, 1, 1],
                    'ID_2' : [2, 2, 4, 4],
                    'ID_3' : [3, 3, 2, 2],
                    'ID_4' : [4, 5, 8, 8],
                    'ID_5' : [5, 4, 7, 7],
                    'some_metric' : [.7, .8, .2, .9]})
In[2]: print df1

Out[2]:

    ID_1  ID_2  ID_3  ID_4  ID_5  some_metric
0     1     2     3     4     5          0.7
1     1     2     3     5     4          0.8
2     1     4     2     8     7          0.2
3     1     4     2     8     7          0.9

是否有一种简单的方法可以按列中的唯一值进行分组?还是有一种方法可以将数据提取到字典中,然后再返回到数据帧中?

1 个答案:

答案 0 :(得分:0)

要对多个列中的项目的唯一组合进行分组,而不考虑顺序,不丢失任何值,请sort并将这些值重新分配给各列。然后,您可以清楚地分组。在这种情况下,我们使用numpy,因为它是更快的排序方式之一

import numpy as np

cols = [f'ID_{i}' for i in range(1,6)]
df1[cols] = np.sort(df1[cols].to_numpy(), axis=1)

df1
#   ID_1  ID_2  ID_3  ID_4  ID_5  some_metric
#0     1     2     3     4     5          0.7
#1     1     2     3     4     5          0.8
#2     1     2     4     7     8          0.2
#3     1     2     4     7     8          0.9

# Grouping on these columns works, regardless of original ordering:
df1.groupby(cols).size()
#ID_1  ID_2  ID_3  ID_4  ID_5
#1     2     3     4     5       2
#            4     7     8       2