【问题标题】:How to compute a function on a group (as aggregation)如何计算组上的函数(作为聚合)
【发布时间】:2019-12-08 05:19:06
【问题描述】:

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

我想计算一个按“事实”分组的列:

  • 并返回 France 如果 Country1 和 Country2 中相同“Fact”编号的所有国家/地区都是“France”
  • 如果对于给定的“事实”编号存在任何国家/地区(最常见的),则返回法国以外的其他国家/地区。

您将如何实现这一目标?

我正在尝试使用 Alteryx 来实现它(由于我们执行 Join、Aggregation、Filter 等,它的操作类似于 SQL)并且无法想象一个简单的过程。

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

输入:

输出:

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

【问题讨论】:

  • 3 应该是法国而不是西班牙
  • 您能否详细说明逻辑的第二部分and return any country,因为看不到 Fact 3 如何返回西班牙或为什么 Fact 4 没有显示。
  • 以文本形式发布表格和数据READ THIS
  • 什么版本的 MySQL 可以处理 alteryx?你能用WITHROW_NUMBER()

标签: mysql python-3.x pandas-groupby alteryx


【解决方案1】:

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

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

现在使用条件聚合发现每个France有多少Fact

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 我们返回 France 否则我们会在该 Fact 组中寻找除法国以外最常见的国家/地区。

请注意,如果出现频率相同的情况,我会返回任何国家/地区。例如,您可以修改为按名称进行额外排序。

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 |

【讨论】:

    【解决方案2】:

    假设你要得到的结果是

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

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

    • 转置
    • 2 平行总结(一组按事实和名称,另一组按事实)
    • 加入(事实)
    • 过滤器(计数 = 右计数):将任何值都相同的地方移到一边
    • 过滤掉 False(值 = 法国)
    • 排序错误:计数降序
    • 独特:事实上
    • 联合:唯一与来自第一个过滤器的 True
    • 选择和排序:整理

    基本上,您所做的是在找到最常见的“非法国”值之前拆分常量值,然后将所有值重新组合在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      相关资源
      最近更新 更多