【问题标题】:Select stament with division operator mysql using pandas dataframe使用 pandas 数据框使用除法运算符 mysql 选择语句
【发布时间】:2016-11-07 17:54:49
【问题描述】:

我的 pandas 数据框中有一个表格:

df = pd.DataFrame({
        'CategoryCount': {0: 0, 1: 12, 2: 15, 3: 0, 4: 25, 5: 0},
        'frequency': {0: 123, 1: 234, 2: 456, 3: 678, 4: 890, 5: 145}
    })

+-----------------+-----------+
|  CategoryCount  | frequency |
+-----------------+-----------+
| 0               | 123       |
| 12              | 234       |
| 15              | 456       |
| 0               | 678       |
| 25              | 890       |
| 0               | 145       |
+-----------------+-----------+

它有 300 行

我想找到总数。 Categorycount 的,频率低于 75% 我正在用普通的 mysql 编写这个查询:

select count(CategoryCount) 
from category_analysis 
where (frequency * 100 / (select sum(frequency) from category_analysis)) < 75

我如何在 pandas 中使用 python 实现相同的功能。

【问题讨论】:

  • 而且,预​​期的输出是?
  • @JohnGalt |count(CategoryCount) |213|是输出
  • IIUIC, (df.frequency &lt; df.frequency.sum() * 0.75 ).sum() 应该可以工作。

标签: python python-2.7 python-3.x pandas dataframe


【解决方案1】:

IIUC 这将相当于 Pandas(10%,因为您的所有样本行

In [15]: df.frequency.sum()
Out[15]: 2526

In [16]: df.frequency / df.frequency.sum() < 0.1
Out[16]:
0     True
1     True
2    False
3    False
4    False
5     True
Name: frequency, dtype: bool

In [17]: df.loc[df.frequency / df.frequency.sum() < .1]
Out[17]:
   CategoryCount  frequency
0              0        123
1             12        234
5              0        145

In [18]: len(df.loc[df.frequency / df.frequency.sum() < .1])
Out[18]: 3

或者更好一点variant from @John Galt:

In [19]: (df.frequency < df.frequency.sum() * 0.1 ).sum()
Out[19]: 3

OP 在 SQL 中的查询:

【讨论】:

  • (df.frequency &lt; df.frequency.sum() * 0.1 ).sum() 应该这样做,而不是 .loc 设置。
  • @JohnGalt,是的,谢谢!它肯定看起来更好!
  • @MaxU 嘿,我不明白你服用 0.1(10%) 你是怎么决定的?如果我的行而不是 300 行会更多
  • @MaxU 我终于明白错误沟通发生在哪里了!我假设在 category_analysis 之前有一个表,其中 Category 作为我们可以执行 value_counts 的列存在。考虑到这一点,我的回答是完全不正确的。我很高兴我继续挖掘,我很高兴你一直在问。
  • @piRSquared,您能否取消删除您的答案 - 这真的很棒,将来可以帮助其他人
【解决方案2】:

注意:这并不能回答 OP 的问题。但是,正如@MaxU 所指出的,它可能对其他人有所帮助。

使用value_counts 和normalize

df.CategoryCount.value_counts(normalize=True).lt(.75).sum()

【讨论】:

  • 看起来很不错,但它给了我完全不同的结果集
  • @MaxU 我冒昧地猜测了 OP 想要什么。我忽略了他们的frequency 列,并假设他们使用值计数或类似的东西来计算它。我的解决方案利用了这些假设,并从一开始就提供了更好的实现。如果我猜对了,考虑到问题不清楚,OP 很幸运。
  • @piRSquared 嘿,我能知道在哪里可以学习所有这些 pandas 高级语法吗?有没有我可以参考的网站或速查表
  • @SRingne 当别人问我同样的问题时,我的回答是一样的。没有比“试炼”更好的学习方法了。尝试回答人们在 SO 上发布的问题。向 MaxU、jezrael、EdChum、unutbu、Psidom 和许多其他人学习,努力比他们更快更好。 6个月前,我以为我知道很多。我在自欺欺人。这些人教会了我很多超出我预期的东西。
  • @piRSquared 感谢先生!我也是这个数据科学领域的初学者,并试图尽快学习!我一定会采纳你的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 2015-04-12
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多