如何计算一个组的函数(作为聚合)
How to compute a function on a group (as aggregation)
我用这个table举了一个简单的例子。
我想计算按 "Fact":
分组的列
- 和return
France
如果同一个"Fact"号码的Country1和Country2的所有国家都是"France"
- 和 return 任何国家(最常见的),如果它存在于给定的 "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 任何国家/地区的领带情况下的通知。例如,您可以修改为按名称进行额外排序。
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" 值并将所有值组合在一起之前拆分常量值。
我用这个table举了一个简单的例子。
我想计算按 "Fact":
分组的列- 和return
France
如果同一个"Fact"号码的Country1和Country2的所有国家都是"France" - 和 return 任何国家(最常见的),如果它存在于给定的 "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 任何国家/地区的领带情况下的通知。例如,您可以修改为按名称进行额外排序。
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" 值并将所有值组合在一起之前拆分常量值。