【问题标题】:Finding the mode of the n smallest rows by count in a CSV通过 CSV 中的计数查找 n 最小行的模式
【发布时间】:2020-03-28 02:37:02
【问题描述】:

我有一个 csv 文件,其中包含以下示例所示的表格:

| TimeStampHour    | Day | Hour | Count |
|------------------|-----|------|-------|
| 28/01/2019 00:00 | Mon | 0    | 198   |
| 28/01/2019 01:00 | Mon | 1    | 513   |
| 28/01/2019 02:00 | Mon | 2    | 110   |
| 28/01/2019 03:00 | Mon | 3    | 50    |
| 28/01/2019 04:00 | Mon | 4    | 6     |
| 28/01/2019 05:00 | Mon | 5    | 6     |
| 28/01/2019 06:00 | Mon | 6    | 1503  |
| 28/01/2019 07:00 | Mon | 7    | 108   |
| 28/01/2019 08:00 | Mon | 8    | 211   |
| 28/01/2019 09:00 | Mon | 9    | 169   |
...

还有一些值会持续几个月,并包含一周中的其他日子一直到周日。

我想要达到的目标:

我想先通过计数找到最小的 25 行,然后输出这些行。 为了在 python 中实现这一点,我做了以下工作:

import pandas as pd
import numpy as np

df = pd.read_csv('mydata.csv')

least25 = df.nsmallest(25, "Count",keep='all')
print(least25)

OUTPUT:

TimeStampHour  Day  Hour  Count
124   02/02/2019 07:00  Sat     7      3
142   03/02/2019 04:00  Sun     4      3
143   03/02/2019 06:00  Sun     6      3
144   03/02/2019 07:00  Sun     7      3
165   04/02/2019 04:00  Mon     4      3
...                ...  ...   ...    ...
1940  20/04/2019 04:00  Sat     4      6
1965  21/04/2019 05:00  Sun     5      6
2131  28/04/2019 04:00  Sun     4      6
3138  09/06/2019 03:00  Sun     3      6
4144  21/07/2019 03:00  Sun     3      6

这我很满意。

我的下一步是对这些结果执行众数计算,以便我可以以与上述相同的输出格式(显示行和列)输出存在众数的行。

我想要的输出如下所示:

| Day | Hour | Count(Min) | Occurance |
|-----|------|------------|-----------|
| Wed | 6    | 3          |     10    |
| Wed | 7    | 3          |      8    |
| Wed | 8    | 3          |      7    |
| Wed | 9    | 3          |      9    |
| Wed | 10   | 3          |     11    |
| Wed | 11   | 3          |      7    |
| Wed | 12   | 3          |      5    |
| Fri | 7    | 3          |      1    |
| Fri | 8    | 3          |      6    |
| Fri | 9    | 3          |      7    |

换句话说:打印具有最常见最小值(模态最小值)最频繁出现的最小计数的行。为了尝试并实现这一点,我们做了以下工作:

modeOfmin = least25['Count'].mode()
print(modeOfMin) 

OUTPUT:
0    6
dtype: int64

我想学习如何实现我想要的输出,但我不知道如何去做。

有人能解释一下吗?

【问题讨论】:

    标签: python-3.x pandas dataframe statistics


    【解决方案1】:

    使用print(least25[least25['Count']==least25['Count'].mode().iat[0]])

    【讨论】:

    • 感谢您提出解决方案。但是,我收到以下异常消息: ValueError: Can only compare same-labeled Series objects
    • @for 你是对的,错误是因为.mode() 返回一个系列而不是一个数值。我编辑了我的答案以正常工作。
    • @jezrael 我的原始(不正确)答案比您早 2 分钟发布。我刚刚添加了 .iat[0] 以使其正常工作。所以,这里没有副本。
    • @jezrael 请检查我的原始(不正确)答案的时间戳和编辑历史,以确认这不是副本。此外,您的解决方案(在我的之后发布)实现了我在原始答案中使用的布尔索引。当然我知道你在 pandas 中很厉害,我每天都在向你学习,我只是不明白你为什么攻击我的答案并称之为复制。
    • @NeofytosBoufidis - 好吧,也许我写错了,我试着解释得更好。
    【解决方案2】:

    使用boolean indexing 将一个元素Series 转换为Series.iat 的标量:

    modeOfmin = least25['Count'].mode()
    df = least25[least25['Count'] == modeOfmin.iat[0]]
    
    print (df)
            TimeStampHour  Day  Hour  Count
    124  02/02/2019 07:00  Sat     7      3
    142  03/02/2019 04:00  Sun     4      3
    143  03/02/2019 06:00  Sun     6      3
    144  03/02/2019 07:00  Sun     7      3
    165  04/02/2019 04:00  Mon     4      3
    

    【讨论】:

    • 太好了,感谢您的解决方案!您是否还介意解释如何打印显示日期和小时的行,其中计数最少,出现次数最多。说计数用作“销售数量”。伪:打印 Day、Hour、occurance WHERE COUNT IS MIN
    • @fore-caster - 我想如果上面的解决方案中有Occurance 列,请再次按df1 = df[df['Occurance'] == df['Occurance'].min()] 过滤
    • 谢谢。 python 可以为出现添加一个额外的列,然后为数据框计算出这些出现吗?
    • @fore-caster - 什么是Occurance 列?计数如何?
    • 所以 count 将是一个类似于“No Of Sales”的列,并且出现次数将是同一行出现相同值的次数。即:星期五,下午 6 点 3 次销售,如果这种情况在一年中发生 10 次,那么将有 10 行,因此发生率为 10。这更有意义吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2013-01-24
    • 2011-11-27
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    相关资源
    最近更新 更多