![](/img/trans.png)
[英]Given a number, create a set of 2-tuples whose sum is equal to the provided number starting from (1, 1)
[英]select n elements from a pandas column whose sum is equal to a provided number
我有一个 pandas dataframe 有一个分数列和一个问题列。 我想根据以下标准提出 select 问题:
IE
得到 5 个总分应该等于的问题,比如说 10。
数据看起来像这样:
指数 | 问题 | 分数 |
---|---|---|
1 | 一个 | 1 |
2 | 乙 | 1 |
3 | C | 1 |
4 | D | 1 |
5 | 乙 | 2 |
6 | F | 2 |
7 | G | 2 |
8 | H | 2 |
9 | 我 | 2 |
10 | Ĵ | 1 |
11 | ķ | 4 |
12 | 大号 | 6 |
13 | 米 | 7 |
14 | ñ | 3 |
15 | ○ | 2 |
16 | 磷 | 5 |
17 | 问 | 1 |
18 | R | 2 |
19 | 小号 | 4 |
如果约束如下
必答题 = 5
要求的最高分数 = 10
那么 output 应该是:
指数 | 问题 | 分数 |
---|---|---|
1 | 一个 | 1 |
2 | 乙 | 1 |
3 | C | 1 |
4 | D | 1 |
10 | Ĵ | 1 |
16 | 磷 | 5 |
任何人都可以提出解决方案吗?
谢谢。
一种方法:
import pandas as pd
from itertools import combinations
df = pd.DataFrame({'index': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19},
'question': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J', 10: 'K', 11: 'L', 12: 'M', 13: 'N', 14: 'O', 15: 'P', 16: 'Q', 17: 'R', 18: 'S'},
'score': {0: 1, 1: 1, 2: 1, 3: 1, 4: 2, 5: 2, 6: 2, 7: 2, 8: 2, 9: 1, 10: 4, 11: 6, 12: 7, 13: 3, 14: 2, 15: 5, 16: 1, 17: 2, 18: 4}})
required_questions = 5
required_score_sum = 10
ind_quest_score_tups = [(i, q, s) for i, q, s in zip(df["index"], df["question"], df["score"])]
candidates = combinations(ind_quest_score_tups, required_questions)
candidates = [c for c in candidates if sum(s for i, q, s in c) == required_score_sum]
for c in candidates:
print(pd.DataFrame.from_records(c, columns=["index", "question", "score"]))
print()
这给了你:
index question score
0 1 A 1
1 2 B 1
2 3 C 1
3 4 D 1
4 12 L 6
index question score
0 1 A 1
1 2 B 1
2 3 C 1
3 5 E 2
4 16 P 5
index question score
0 1 A 1
1 2 B 1
2 3 C 1
3 6 F 2
4 16 P 5
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.