将块中的行按25个块分组

时间:2014-09-29 10:36:33

标签: python csv grouping

我有一个包含2列的csv文件,表示每年的项目分布,如下所示:

A       B

1900    10
1901    2
1903    5
1908    8
1910    25
1925    3
1926    4
1928    1
1950    10

等,大约15000行。

根据这些数据制作分布图时,斧头上的分数太多,不是很漂亮。我希望按照25年的方块对行进行分组,这样最终我的斧头点数会减少。 因此,例如,从1900年到1925年,我将得到一些生产项目,A列中的1行和B列中的1行:

1925  53
1950  15

到目前为止,我只想到了如何将csv文件中的数据转换为int:

o=open('/dates_dist.csv', 'rU')
mydata = csv.reader(o)


def int_wrapper(mydata):
    for v in reader:
        yield map(int, v)

reader = int_wrapper(mydata) 

找不到如何进一步做...

3 个答案:

答案 0 :(得分:3)

您可以使用itertools.groupby

import itertools as IT
import csv

def int_wrapper(mydata):
    for v in mydata:
        yield map(int, v)


with open('data', 'rU') as o:
    mydata = csv.reader(o)
    header = next(mydata)
    reader = int_wrapper(mydata)
    for key, group in IT.groupby(reader, lambda row: (row[0]-1)//25+1):
        year = key*25
        total = sum(row[1] for row in group)
        print(year, total)

产量

(1900, 10)
(1925, 43)
(1950, 15)

请注意,1900年至1925年(包括)跨越26年,而不是25年。所以 如果你想分组25年,考虑到报告总数的方式,你可能想要半开的间隔(1900, 1925]


表达式row[0]//25取年份,整数除以25。     该数字对于[1900,1925]范围内的所有数字都是相同的。     要使范围在左侧半开,请减去并添加1:(row[0]-1)//25+1

答案 1 :(得分:0)

这是我的方法。它绝对不是最吸引人的python代码,但可能是实现所需输出的一种方式。

if __name__ == '__main__':   

    o=open('dates_dist.csv', 'rU')
    lines = o.read().split("\n") # Create a list having each line of the file

    out_dict = {}
    curr_date  = 0;
    curr_count = 0
    chunk_sz   =  25; #years
    if len(lines) > 0:
        line_split = lines[0].split(",")
        start_year = int(line_split[0])
        curr_count = 0

        # Iterate over each line of the file
        for line in lines:
            # Split at comma to get the year and the count. 
            # line_split[0] will be the year and line_split[1] will be the count.
            line_split = line.split(",")
            curr_year = int(line_split[0])
            time_delta = curr_year-start_year

            if time_delta<chunk_sz or time_delta == chunk_sz:
                curr_count = curr_count + int(line_split[1])
            else:
                out_dict[start_year+chunk_sz] = curr_count
                start_year = start_year+chunk_sz
                curr_count = int(line_split[1])

            #print curr_year , curr_count    

        out_dict[start_year+chunk_sz] = curr_count
    print out_dict        

答案 2 :(得分:0)

在进行一些整数除法后,你可以创建一个虚拟列和组:

df['temp'] = df['A'] // 25
>>> df
      A   B  temp
0  1900  10    76
1  1901   2    76
2  1903   5    76
3  1908   8    76
4  1910  25    76
5  1925   3    77
6  1926   4    77
7  1928   1    77
8  1950  10    78

>>> df.groupby('temp').sum()
         A   B
temp          
76    9522  50
77    5779   8
78    1950  10

我的数字与你的数字略有不同,因为我从1900年至1924年,1925年至1949年和1950年至1974年在技术上分组,但这个想法是一样的。