【问题标题】:Count frequency of values in a row? [closed]连续计算值的频率? [关闭]
【发布时间】:2021-06-11 17:03:03
【问题描述】:

我有一个如下图所示的数据框(这是一个例子,原来的要大得多):

我试图回答这个问题,“有多少行有三个真值?两个真值?一个真值?”

我更喜欢在 SQL 中执行此操作,但我正在努力寻找解决方案。我也在努力使用 Python 在 Pandas 中找到解决方案。在这一点上,我对任何一种解决方案都持开放态度。

如果有人有任何指点,我将不胜感激。我确定这是一个简单的解决方案,只是我还没有学会它,我找不到正确的方法。

【问题讨论】:

  • 请发布一个可重现的最小示例,并始终发布实际数据而不是数据图像。如果您不要求人们手动输入您的测试数据集,您将收到更高质量的答案。

标签: python sql sqlite count


【解决方案1】:

你可以试试:

(df.isin(["TRUE"])).sum(axis=1).value_counts()

df.isin(["TRUE"]) 而不是df == "TRUE" 部分用于解决here 描述的问题。

示例示例数据框:

import numpy as np
a = np.random.choice(["TRUE", "FALSE"], (5, 5))
df = pd.DataFrame(a)
df = df.reset_index()
print(df)

这给出了:

   index      0      1      2      3      4
0      0   TRUE   TRUE   TRUE  FALSE   TRUE
1      1  FALSE   TRUE  FALSE   TRUE   TRUE
2      2   TRUE   TRUE   TRUE  FALSE  FALSE
3      3  FALSE  FALSE   TRUE  FALSE   TRUE
4      4   TRUE   TRUE   TRUE   TRUE   TRUE

然后

(df.isin(["TRUE"])).sum(axis=1).value_counts()

给予:

3    2
5    1
4    1
2    1

即“TRUE”出现2行3次、1行5次、1行4次、1行2次。

【讨论】:

  • 很好的解决方案,但 df =="TRUE" 不会为您的示例生成未来警告。
【解决方案2】:

您可以通过 CTELEFT 连接来实现,它将所有可能的结果(0、1、2、3)返回到表和聚合中。

如果ValueX列的数据类型为TEXT

WITH cte(total) AS (VALUES (0), (1), (2), (3))
SELECT c.total, COUNT(t.number) counter
FROM cte c LEFT JOIN tablename t
ON c.total = (t.ValueA = 'TRUE') + (t.ValueB = 'TRUE') + (t.ValueC = 'TRUE')
GROUP BY total

如果你想要 1 行中的结果:

SELECT SUM(total = 0) total_0,
       SUM(total = 1) total_1,
       SUM(total = 2) total_2,
       SUM(total = 3) total_3
FROM (       
  SELECT (ValueA = 'TRUE') + (ValueB = 'TRUE') + (ValueC = 'TRUE') total
  FROM tablename
)

请参阅demo

如果ValueX列的数据类型为BOOLEAN(或INTEGER):

WITH cte(total) AS (VALUES (0), (1), (2), (3))
SELECT c.total, COUNT(t.number) counter
FROM cte c LEFT JOIN tablename t
ON c.total = t.ValueA + t.ValueB + t.ValueC
GROUP BY total

如果你想要 1 行中的结果:

SELECT SUM(total = 0) total_0,
       SUM(total = 1) total_1,
       SUM(total = 2) total_2,
       SUM(total = 3) total_3
FROM (       
  SELECT ValueA + ValueB + ValueC total
  FROM tablename
)

请参阅demo

【讨论】:

    【解决方案3】:

    实际上,如果值是字符串,则有一种使用字符串函数的 hacky 方法:

    select 15 - length(A || B || C) as num_true, count(*)
    from t
    group by num_true;
    

    这使用了 TRUE 有 4 个字符,FALSE 有五个字符的事实,所以这不适用于所有语言。

    您可以合并此逻辑,使值位于不同的列中:

    select sum(15 = length(A || B || C) as true_0,
           sum(14 = length(A || B || C) as true_1,
           sum(13 = length(A || B || C) as true_2,
           sum(12 = length(A || B || C) as true_3
    from t;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2019-06-04
      相关资源
      最近更新 更多