与橙色组中的最大值保持一行

Keeping a row with the max value in a group in Orange

我有一个包含数字分数和几个组标准的数据集,例如Class,测试,评分。我如何才能 select 仅从每个 class 中获得最高分并测试传递给下一个小部件?未处理数据的示例如下:

Class Test Score
A English 99
A English 108
A English 30
A Geography 20
A Geography 34
A Geography 101
B Science 90
B Science 30

我要传递给下一个小部件的是每个组的最高分数,如下

Class Test Score
A English 108
A Geography 101
B Science 90

我知道如何在 SQL 中执行此操作,但是 SQL 小部件无法安装,并且在尝试安装 psycopg2 2 小时后我已经有点失去了生存的意愿,并且失败。除了 SQL 之外,还有其他方法可以在 Orange 中完成吗?

提前致谢!

没有可以直接执行此操作的小部件,但您可以使用 Python Script 小部件。您可以在小部件输入处连接您的输入,然后在小部件中粘贴类似于此的代码:

from Orange.data import Table, Domain, DiscreteVariable, ContinuousVariable
import pandas as pd

# transforming table to pandas
df = pd.DataFrame(in_data.X, columns=list(map(str, in_data.domain.attributes)))

# here we use pandas to find lines with maximal scores in a group
idx = df.groupby(['Test'])['Score'].transform(max) == df['Score']

# transform results back to Onange Table
out_data = Table(Domain(in_data.domain.attributes), df[idx].values)

您连接到小部件的数据在 in_data 变量中可用,您必须将输出数据保存在 out_data 变量中。这里我们使用 pandas 来查找组中的最大行数,因为它更简单。您也可以使用标准的 Pythonic 方式。

现在您将 Python Script 小部件的输出连接到您要使用的小部件。