如何计算一个组的函数(作为聚合)

How to compute a function on a group (as aggregation)

我用这个table举了一个简单的例子。

我想计算按 "Fact":

分组的列

您将如何实现?

我正在尝试使用 Alteryx 实现它(由于我们执行连接、聚合、过滤等,它的操作大致类似于 SQL)并且无法想象一个简单的过程。

您将如何使用 alteryx、SQL 或 Python 解决该问题 [编辑:我对您使用库 pandas 解决问题的方式非常感兴趣(在 Python) 中。我认为在 grouping/agregating 之后可以在每个组上应用自定义函数(这类似于索引数据框)并且过程会更容易)]?

输入:

输出:

编辑:是的,建议 3 应该是法国,4:西班牙!

首先我们需要将两个国家字段合并到一个字段中,我们称之为 t

SELECT Fact, Country1 as Country
FROM Table1
UNION ALL
SELECT Fact, Country2
FROM Table1

现在使用条件聚合找到每个 Fact

有多少 France
COUNT(CASE WHEN Country = 'France' THEN 1 END) as total_france,
COUNT(Country) as total_country

部分结果我们称之为r

| Fact | total_france | total_country |
|------|--------------|---------------|
|    1 |            3 |             4 |
|    2 |            1 |             2 |
|    3 |            4 |             4 |
|    4 |            1 |             4 |

最后,如果 total_france = total_country 我们 return France 否则我们会在该事实组中寻找除法国以外最常见的国家。

在频率为 I return 任何国家/地区的领带情况下的通知。例如,您可以修改为按名称进行额外排序。

SQL DEMO

SELECT Fact, CASE WHEN total_france = total_country 
                  THEN 'France' 
                  ELSE (SELECT Country
                        FROM   (SELECT Fact, Country1 as Country
                                FROM Table1
                                UNION ALL
                                SELECT Fact, Country2
                                FROM Table1
                                ) s
                        WHERE r.Fact = s.Fact
                          AND s.Country <> 'France'
                        GROUP BY Country
                        ORDER BY Count(*) DESC
                        LIMIT 1)                        
             END as Country
FROM (
      SELECT Fact, 
             COUNT(CASE WHEN Country = 'France' THEN 1 END) as total_france,
             COUNT(Country) as total_country
      FROM (
            SELECT Fact, Country1 as Country
            FROM Table1
            UNION ALL
            SELECT Fact, Country2
            FROM Table1
           ) t
      GROUP BY Fact
     ) r;  

输出

| Fact | Country |
|------|---------|
|    1 | England |
|    2 | Germany |
|    3 |  France |
|    4 |   Spain |

假设您想要的结果是

|Fact   |Country|
|1      |England|
|2      |Germany|
|3      |France |
|4      |Spain  |

那么在 Alteryx 中,工具的顺序将是:

  • 转置
  • 2 平行总结(一组按事实和姓名,另一组按事实)
  • 加入(事实上)
  • 过滤器(计数 = 正确计数):将所有值相同的地方移到一边
  • 过滤掉 False(值 = 法国)
  • 错误排序:降序计数
  • 独一无二:事实上
  • Union:与第一个过滤器中的 True 唯一
  • Select & 排序:整理

本质上,您所做的是在找到最常见的 "non-France" 值并将所有值组合在一起之前拆分常量值。