繁体   English   中英

select 来自 pandas 列的 n 个元素,其总和等于提供的数字

[英]select n elements from a pandas column whose sum is equal to a provided number

我有一个 pandas dataframe 有一个分数列和一个问题列。 我想根据以下标准提出 select 问题:

  1. 问题数
  2. 累积分数

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM