![](/img/trans.png)
[英]Pandas drop duplicates on one column and keep only rows with the most frequent value in another column
[英]How to SELECT DISTINCT() and then keep rows with most frequent value in another column?
示例表列:
x y
255 0
255 0
5 10
5 0
5 1
5 0
255 0
255 0
2 5
2 2
2 5
255 0
第一步是识别 X 的唯一值:
SELECT distinct(X) FROM nodes ORDER BY X
结果:
2
5
255
注意:Order by 不是必需的,它可以使结果更易于阅读。
对于 x 列中的每个值,我想在 y 列中找到最常见的值(仅针对共享相同 X 值的行,而不是整个表)和 output 那一行。
我可以很容易地手动完成:
SELECT x, y, COUNT(y) AS 'n'
FROM nodes
WHERE x = 2 /* Manually edit this number to get desired result */
GROUP BY y
ORDER BY COUNT(y) DESC
LIMIT 1
结果:
when x = 2 2, 5, 2
when x = 5 5, 0, 2
when x = 255 255, 0, 5
注意:我不需要 output COUNT(y) AS 'n'
。 它包含在这里是为了更容易看到正在发生的事情。
我可以在 Python 中执行此操作,方法是遍历第一个查询中的唯一 x 值并将该数字插入每个循环的第二个查询中。 我也可以只使用这样的查询并在 Python 中完成所有工作:
SELECT x, y FROM nodes ORDER BY x
我更愿意使用 SQL 在一个查询中完成所有操作。
有没有办法表达“对于查询 #1 中的每个 x,在 WHERE 子句中使用 x 运行查询 #1”的想法,以从一个查询操作中提供单个结果?
使用FIRST_VALUE()
window function:
SELECT DISTINCT x,
FIRST_VALUE(y) OVER (PARTITION BY x ORDER BY COUNT(*) DESC) y
FROM tablename
GROUP BY x, y;
请参阅演示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.