我有一个数据框,其中包含五列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
是否有一种简单的方法可以按列中的唯一值进行分组?还是有一种方法可以将数据提取到字典中,然后再返回到数据帧中?
答案 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