Deedle.Frame.AggregateRowsBy使用多个列来评估aggFunc

时间:2018-12-05 17:52:10

标签: c# dataframe deedle

问题:是否有可能让Deedle.Frame.AggregateRowsBy(groupBy, aggBy, aggFunc)返回aggFunc而不是仅aggby列基于多个列的值?

>

这完全有可能还是我应该考虑添加中间步骤,以便我的aggFunc始终在单个列上运行?

下面的示例:我有一个Deedle.Frame df,以简化的方式,看起来像下面的那个。

Round   Group   Goals
  1       1       10
  1       2       12
  1       3        9
  2       1       11
  2       2       12
  2       3       12
  3       2       10
  3       3       12

我想为每个不同的Round值确定哪个Group值是“赢家”(即Goals值更高的那个)。

在上面的示例中,我希望最终得分如下:

Group  Points
  1        0
  2      1.5
  3      1.5

(对于Round == 2Group == 2Group == 3之间有一个平局,因此得分为0.5。换句话说,每个Group1都有一个得分的1分中,得分最高的Group的所有Goals中均分。

如果第一个表是List<Tuple<int, int, int>> allGoals,我可以使用LinQ通过执行以下操作来评估我想要的内容:

Dictionary<int, double> finalScorePerGroup = new Dictionary<int, double>();
// Pretend there is some code to add keys 1, 2, 3 to finalScorePerGroup 

// Group the tuples by its Round value
IEnumerable<IGrouping<int, Tuple<int, int, int>> groupedByRound =
    allGoals.GroupBy(x => x.Item1);

double pointsScored;

// Loop through each Grouping
foreach (IGrouping<int, Tuple<int, int, int>> group in groupedByRound) {
    // For a given Round value, find which is the maximum number of Goals
    double maxPts = group.Select(x => x.Item3).Max();

    // Find out how many Group scored maximum number of Goals in this Round 
    double noWinners = group.Where(x => x.Item3.Equals(maxPts)).Count();

    // Now loop through every Group, and if they scored maximum Goals, add
    // to their final score
    foreach(Tuple<int, int, int>> result in group) {
        pointsScored = result.Item3.Equals(maxPts) ? maxPts/noWinners : 0;
        finalScorePerGroup[result.Item2] += pointsScored;
    }
}

现在,如果我想在框架上进行评估,我知道我需要类似的东西:

Frame<int, string> aggFrame = df.AggregateRowsBy<double, double>(
            new[] { "Round" },
            new[] { "Group" }, some aggregating function);

我认为在这种情况下,我希望我的汇总函数返回在这一轮(即汇总之后)获得最高分的一个或多个小组:

Round   Group
  1       2 
  2     {2,3}
  3       3

我对Deedle还是很陌生,请随时指出这是没有道理的还是我的方法是错误的。

非常感谢您的帮助。

0 个答案:

没有答案