根据不同列中的条件为True的索引计算1列中值的出现次数

时间:2014-08-26 21:55:35

标签: python numpy

我有4列中的数据,如下所示:

day month year value
 1    1   1880  1
Etc. for each day in a month for each month for 1880-2013.
Values range from 1 to 8

存储数据

我想计算给定月份和年份中每个“价值”发生的次数。所以像这样:

data = np.loadtxt('/path/to/file', skiprows=1)

def magic_func(data,year,month):
for each in zip(data[:,1], data[:,2]):
    if each == (month,year):
        #actual magic

E.g。输出:

[(1,0), (2,30), (3,0), (4,0), (5,1), (6,0), (7,0), (8,0)]

所以我想我需要一种方法来根据上面 if 为True的索引对数据的最后一列进行索引,然后计算(可能是np.bincount? )每个“价值”发生多少次。虽然我在代码方面没有取得多大进展......

有人可以帮忙吗?

编辑:我并不热衷于发布任何真实数据,即使是1年就是365个数据点!数据存储在由制表符分隔的.txt文件中,但我也可以将其存储为csv。下面是一个(非常小的)样本。虽然在复制时没有完全保留正确的选项卡,但实际文件显然每个列都在相应的名称下...我最初做的是将数据表单复制到其他地方并使用Excel的Text to Columns来创建我的.txt。

day     month   year    value
1   1   1956    3
2   1   1956    3
3   1   1956    8
4   1   1956    8
5   1   1956    8
6   1   1956    3
7   1   1956    1
8   1   1956    1
9   1   1956    3
10  1   1956    3
11  1   1956    3
12  1   1956    3
13  1   1956    1
14  1   1956    1
15  1   1956    3
16  1   1956    2
17  1   1956    3
18  1   1956    3
19  1   1956    3
20  1   1956    3
21  1   1956    3
22  1   1956    3
23  1   1956    3
24  1   1956    3
25  1   1956    1
26  1   1956    7
27  1   1956    4
28  1   1956    4
29  1   1956    4
30  1   1956    1
31  1   1956    1

我想要的是“价值”下的所有商品,其中“月”是例如在这种情况下,1计算每个唯一“值”发生的次数。在这种特殊情况下,输出为:

[(3,16), (8,3), (1,7), (2,1), (7,1), (4,3)] # format is (value, count)
# or if displaying all possible values
[(1,7), (2,1), (3,16), (4,3), (5,0), (6,0), (7,1), (8,3)] 

这有意义吗?

干杯!

1 个答案:

答案 0 :(得分:0)

import csv
import collections

def count(infilepath):
    answer = collections.defaultdict(lambda : collections.defaultdict(lambda : collections.defaultdict(int)))
    with open(infilepath) as infile:
        infile.readline()
        for line in csv.reader(infile, delimiter='\t'):
            *_rest, month, year, value = [int(i) for i in line]
            answer[year][month][value] += 1
    return answer

用法:

counts = count('/path/to/input')
for year in sorted(counts):
    yeard = counts[year]
    for month in sorted(yeard):
        monthd = yeard[month]
        for day in sorted(monthd):
            occ = monthd[day]
            print("In year %d, in month %d, there were %d occurrences of day %d" %(year, month, val, day))