【发布时间】:2018-08-15 12:51:31
【问题描述】:
考虑以下数据集,
Name Age Grade
Person1 18 50
Person2 19 100
Person3 20 0
Person4 21 -25
Person5 22 -125
Person6 23 80
Person7 24 -70
如果我想根据学生的成绩汇总将他们分组,我会怎么做? 我的意思是 - 我想让学生分组,例如该年级所有学生的成绩总和为 0 或尽可能接近零。
因此,理想情况下 - 数据集的答案类似于 -
Group 1 ----> Person1、Person2、Person4、Person5(因为他们的 加分是 0)
Group 2 ----> Person3(因为等级是0)
- Group 3 ----> Person6, Person7(因为加起来是10)
我是如何着手解决这个问题的 -
new_dt = pd.read_csv('../tt.csv')
a = list(itertools.chain.from_iterable(
[[j for i in el for j in i] for el in itertools.combinations(new_dt.values.tolist(),i)]
for i in range(1, len(new_dt)+1)
)
)
out = pd.DataFrame(a)
所以,基本上我正在使用 itertools.combinations 找出所有可能的组合
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0 Person1 18 50
1 Person2 19 100
2 Person3 20 0
3 Person4 21 -25
4 Person5 22 -125
5 Person6 23 80
6 Person7 24 -70
7 Person1 18 50 Person2 19 100
8 Person1 18 50 Person3 20 0
9 Person1 18 50 Person4 21 -25
10 Person1 18 50 Person5 22 -125
11 Person1 18 50 Person6 23 80
12 Person1 18 50 Person7 24 -70
13 Person2 19 100 Person3 20 0
14 Person2 19 100 Person4 21 -25
15 Person2 19 100 Person5 22 -125
16 Person2 19 100 Person6 23 80
17 Person2 19 100 Person7 24 -70
18 Person3 20 0 Person4 21 -25
19 Person3 20 0 Person5 22 -125
20 Person3 20 0 Person6 23 80
21 Person3 20 0 Person7 24 -70
22 Person4 21 -25 Person5 22 -125
23 Person4 21 -25 Person6 23 80
24 Person4 21 -25 Person7 24 -70
25 Person5 22 -125 Person6 23 80
26 Person5 22 -125 Person7 24 -70
27 Person6 23 80 Person7 24 -70
28 Person1 18 50 Person2 19 100 Person3 20 0
29 Person1 18 50 Person2 19 100 Person4 21 -25
30 Person1 18 50 Person2 19 100 Person5 22 -125
31 Person1 18 50 Person2 19 100 Person6 23 80
32 Person1 18 50 Person2 19 100 Person7 24 -70
33 Person1 18 50 Person3 20 0 Person4 21 -25
34 Person1 18 50 Person3 20 0 Person5 22 -125
35 Person1 18 50 Person3 20 0 Person6 23 80
36 Person1 18 50 Person3 20 0 Person7 24 -70
37 Person1 18 50 Person4 21 -25 Person5 22 -125
38 Person1 18 50 Person4 21 -25 Person6 23 80
39 Person1 18 50 Person4 21 -25 Person7 24 -70
40 Person1 18 50 Person5 22 -125 Person6 23 80
41 Person1 18 50 Person5 22 -125 Person7 24 -70
42 Person1 18 50 Person6 23 80 Person7 24 -70
43 Person2 19 100 Person3 20 0 Person4 21 -25
44 Person2 19 100 Person3 20 0 Person5 22 -125
45 Person2 19 100 Person3 20 0 Person6 23 80
46 Person2 19 100 Person3 20 0 Person7 24 -70
47 Person2 19 100 Person4 21 -25 Person5 22 -125
48 Person2 19 100 Person4 21 -25 Person6 23 80
49 Person2 19 100 Person4 21 -25 Person7 24 -70
50 Person2 19 100 Person5 22 -125 Person6 23 80
51 Person2 19 100 Person5 22 -125 Person7 24 -70
52 Person2 19 100 Person6 23 80 Person7 24 -70
53 Person3 20 0 Person4 21 -25 Person5 22 -125
54 Person3 20 0 Person4 21 -25 Person6 23 80
55 Person3 20 0 Person4 21 -25 Person7 24 -70
56 Person3 20 0 Person5 22 -125 Person6 23 80
57 Person3 20 0 Person5 22 -125 Person7 24 -70
58 Person3 20 0 Person6 23 80 Person7 24 -70
59 Person4 21 -25 Person5 22 -125 Person6 23 80
60 Person4 21 -25 Person5 22 -125 Person7 24 -70
61 Person4 21 -25 Person6 23 80 Person7 24 -70
62 Person5 22 -125 Person6 23 80 Person7 24 -70
63 Person1 18 50 Person2 19 100 Person3 20 0 Person4 21 -25
64 Person1 18 50 Person2 19 100 Person3 20 0 Person5 22 -125
65 Person1 18 50 Person2 19 100 Person3 20 0 Person6 23 80
66 Person1 18 50 Person2 19 100 Person3 20 0 Person7 24 -70
67 Person1 18 50 Person2 19 100 Person4 21 -25 Person5 22 -125
68 Person1 18 50 Person2 19 100 Person4 21 -25 Person6 23 80
69 Person1 18 50 Person2 19 100 Person4 21 -25 Person7 24 -70
70 Person1 18 50 Person2 19 100 Person5 22 -125 Person6 23 80
71 Person1 18 50 Person2 19 100 Person5 22 -125 Person7 24 -70
72 Person1 18 50 Person2 19 100 Person6 23 80 Person7 24 -70
73 Person1 18 50 Person3 20 0 Person4 21 -25 Person5 22 -125
74 Person1 18 50 Person3 20 0 Person4 21 -25 Person6 23 80
75 Person1 18 50 Person3 20 0 Person4 21 -25 Person7 24 -70
76 Person1 18 50 Person3 20 0 Person5 22 -125 Person6 23 80
77 Person1 18 50 Person3 20 0 Person5 22 -125 Person7 24 -70
78 Person1 18 50 Person3 20 0 Person6 23 80 Person7 24 -70
79 Person1 18 50 Person4 21 -25 Person5 22 -125 Person6 23 80
80 Person1 18 50 Person4 21 -25 Person5 22 -125 Person7 24 -70
81 Person1 18 50 Person4 21 -25 Person6 23 80 Person7 24 -70
82 Person1 18 50 Person5 22 -125 Person6 23 80 Person7 24 -70
83 Person2 19 100 Person3 20 0 Person4 21 -25 Person5 22 -125
84 Person2 19 100 Person3 20 0 Person4 21 -25 Person6 23 80
85 Person2 19 100 Person3 20 0 Person4 21 -25 Person7 24 -70
86 Person2 19 100 Person3 20 0 Person5 22 -125 Person6 23 80
87 Person2 19 100 Person3 20 0 Person5 22 -125 Person7 24 -70
88 Person2 19 100 Person3 20 0 Person6 23 80 Person7 24 -70
89 Person2 19 100 Person4 21 -25 Person5 22 -125 Person6 23 80
90 Person2 19 100 Person4 21 -25 Person5 22 -125 Person7 24 -70
91 Person2 19 100 Person4 21 -25 Person6 23 80 Person7 24 -70
92 Person2 19 100 Person5 22 -125 Person6 23 80 Person7 24 -70
93 Person3 20 0 Person4 21 -25 Person5 22 -125 Person6 23 80
94 Person3 20 0 Person4 21 -25 Person5 22 -125 Person7 24 -70
95 Person3 20 0 Person4 21 -25 Person6 23 80 Person7 24 -70
96 Person3 20 0 Person5 22 -125 Person6 23 80 Person7 24 -70
97 Person4 21 -25 Person5 22 -125 Person6 23 80 Person7 24 -70
98 Person1 18 50 Person2 19 100 Person3 20 0 Person4 21 -25 Person5 22 -125
99 Person1 18 50 Person2 19 100 Person3 20 0 Person4 21 -25 Person6 23 80
100 Person1 18 50 Person2 19 100 Person3 20 0 Person4 21 -25 Person7 24 -70
101 Person1 18 50 Person2 19 100 Person3 20 0 Person5 22 -125 Person6 23 80
102 Person1 18 50 Person2 19 100 Person3 20 0 Person5 22 -125 Person7 24 -70
103 Person1 18 50 Person2 19 100 Person3 20 0 Person6 23 80 Person7 24 -70
104 Person1 18 50 Person2 19 100 Person4 21 -25 Person5 22 -125 Person6 23 80
105 Person1 18 50 Person2 19 100 Person4 21 -25 Person5 22 -125 Person7 24 -70
106 Person1 18 50 Person2 19 100 Person4 21 -25 Person6 23 80 Person7 24 -70
107 Person1 18 50 Person2 19 100 Person5 22 -125 Person6 23 80 Person7 24 -70
108 Person1 18 50 Person3 20 0 Person4 21 -25 Person5 22 -125 Person6 23 80
109 Person1 18 50 Person3 20 0 Person4 21 -25 Person5 22 -125 Person7 24 -70
110 Person1 18 50 Person3 20 0 Person4 21 -25 Person6 23 80 Person7 24 -70
111 Person1 18 50 Person3 20 0 Person5 22 -125 Person6 23 80 Person7 24 -70
112 Person1 18 50 Person4 21 -25 Person5 22 -125 Person6 23 80 Person7 24 -70
113 Person2 19 100 Person3 20 0 Person4 21 -25 Person5 22 -125 Person6 23 80
114 Person2 19 100 Person3 20 0 Person4 21 -25 Person5 22 -125 Person7 24 -70
115 Person2 19 100 Person3 20 0 Person4 21 -25 Person6 23 80 Person7 24 -70
116 Person2 19 100 Person3 20 0 Person5 22 -125 Person6 23 80 Person7 24 -70
117 Person2 19 100 Person4 21 -25 Person5 22 -125 Person6 23 80 Person7 24 -70
118 Person3 20 0 Person4 21 -25 Person5 22 -125 Person6 23 80 Person7 24 -70
119 Person1 18 50 Person2 19 100 Person3 20 0 Person4 21 -25 Person5 22 -125 Person6 23 80
120 Person1 18 50 Person2 19 100 Person3 20 0 Person4 21 -25 Person5 22 -125 Person7 24 -70
121 Person1 18 50 Person2 19 100 Person3 20 0 Person4 21 -25 Person6 23 80 Person7 24 -70
122 Person1 18 50 Person2 19 100 Person3 20 0 Person5 22 -125 Person6 23 80 Person7 24 -70
123 Person1 18 50 Person2 19 100 Person4 21 -25 Person5 22 -125 Person6 23 80 Person7 24 -70
124 Person1 18 50 Person3 20 0 Person4 21 -25 Person5 22 -125 Person6 23 80 Person7 24 -70
125 Person2 19 100 Person3 20 0 Person4 21 -25 Person5 22 -125 Person6 23 80 Person7 24 -70
126 Person1 18 50 Person2 19 100 Person3 20 0 Person4 21 -25 Person5 22 -125 Person6 23 80 Person7 24 -70
得到之后,所有的成绩都在每 3 列,所以我将每 3 行的总和添加到该行与
only_grades['Total'] = only_grades.sum(axis=1)
out['Total'] = only_grades['Total']
out.to_csv('../tt_2.csv')
添加一列“总计”,每行包含以下输出,
Total
50
100
0
-25
-125
80
-70
150
50
25
-75
130
-20
100
75
-25
180
30
-25
-125
80
-70
-150
55
-95
-45
-195
10
150
125
25
230
80
25
-75
130
-20
-100
105
-45
5
-145
60
75
-25
180
30
-50
155
5
55
-95
110
-150
55
-95
-45
-195
10
-70
-220
-15
-115
125
25
230
80
0
205
55
105
-45
160
-100
105
-45
5
-145
60
-20
-170
35
-65
-50
155
5
55
-95
110
30
-120
85
-15
-70
-220
-15
-115
-140
0
205
55
105
-45
160
80
-70
135
35
-20
-170
35
-65
-90
30
-120
85
-15
-40
-140
80
-70
135
35
10
-90
-40
10
然后我想知道,我会用这些来制作组。您如何看待这种方法?以及如何使用“总计”列创建组,以便在创建组时考虑原始数据集中的每一行,而不是更多。
【问题讨论】:
-
一个问题;查看您的“理想”输出,您将
Person 3作为一个单独的组。那么,所有评分为 0 的Person(s) 是否应该单独在一个单独的组中? -
不,我会将所有 0 成绩归为一组。我只是想区分一下,在那种情况下我更喜欢 3 个组,而不是将 Person3 与 Person6 和 Person7 一起添加。
-
您要解决的真正问题是什么?为什么要创建成绩总和为 0 的学生组?如果所有学生的成绩都为零,那么应该有多少个集群?了解真正的业务目标可能表明另一种方法更合适。
-
好的,所以也许成绩不是解释问题的最佳例子。想象一下标准是“投入的时间”。我想将学生分组在一起,他们作为一个组投入的时间尽可能接近 0。这有点意思?所有投入时间为 0 小时的学生将被放在一起。
-
但是如果你有两个总和为0的组,那么它们不应该合并吗?我不明白这个分组逻辑是为了完成什么......
标签: python python-3.x combinations mathematical-optimization itertools