pandas 使用python panda在 Dataframe 内找到最佳组合,以获得最大总体平均值

zpgglvta  于 2023-01-19  发布在  Python
关注(0)|答案(1)|浏览(131)

假设有一个 Dataframe ,统计如下表:
| 时间|A类|乙|C级|D级|E级|组合A~E|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1个|十个|二十个|五个|八个|-8个|七点整|
| 第二章|二十个|-3个|六个|-5个|十个|五点六零|
| 三个|-5个|四十|五个|四个|二十个|十二点八零|
| 四个|六个|-8个|第二章|十八|五个|四点六零|
| 五个|八个|-1人|-4个|-5个|四个|0.40|
| 平均值|七点八零|九时六十分|二点八零|四点整|六点二十分|六点零八分|
| 标准差|八点零一分|十七点九六分|三点六六|八点六五|九时零九分|四点零二分|
| 比值(平均值/标准差)|0.97|0.53|0.77|0.46|0.68|一点五一|
由上表可知,综合所有A~E,总体平均值为6.08,标准差为4.02,比值为1.51。
通过删除A~E列中的一些列,也许我可以最大化平均值,最小化标准差,或者两者都做(增加比率)。
(* 表示我将删除列中的整个值,而不是每行中的单个值)
有没有什么方法可以找出从A到E列的"最佳组合",这些列给出:
A)最大平均值
B)最小标准偏差
C)A/B的最大比值?
期望的答案可能类似于:A、B、C、A、B、E、A、B、C、D或甚至A、B、C、D、E

tcomlyy6

tcomlyy61#

为了找到每一行的最佳匹配子集,你可以创建所有可能的子集,然后找到最大值/最小值。例如,下面的代码计算第一个条件的最佳列数:

import itertools
import numpy as np

def com(row):
    s = []
    for i in range(2, len(row)+1):
       s.extend([x for x in itertools.combinations(row.values, i)])
    vals = s[np.argmax([np.mean(x) for x in s])]
    return row[row.isin(vals)].index.values

df.apply(com, axis = 1)

对于前两行,结果如下:
根据评论,这可能会有所帮助:

string = '''Time    A   B   C   D   E
Average 7.80    9.60    2.80    4.00    6.20
Standard Deviation  8.01    17.96   3.66    8.65    9.09
Ratio (Average/S.D) 0.97    0.53    0.77    0.46    0.68'''
data = np.array([x.split('  ') for x in string.split('\n')])
df = pd.DataFrame(data[1:,1:], columns = data[0,1:], index = data[1:,0])
df = df.astype(float)

df.apply(com, axis = 1)

输出:

Average                [A, B]
Standard Deviation     [B, E]
Ratio (Average/S.D)    [A, C]
dtype: object

你可以根据你的目标选择最好的。

相关问题