我有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)


找不到进一步的方法...

最佳答案

您可以使用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

关于python - 将CSV中的行按25个块进行分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26097880/

10-12 18:46