python - 按 25 个 block 对 CSV 中的行进行分组

标签 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 年的区 block 对行进行分组,这样最终我的斧头点数就会减少。 因此,例如,从 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 - 按 25 个 block 对 CSV 中的行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26097880/

相关文章:

python - 编写大型数据帧的字典以实现卓越

python - 添加覆盖 twinx 轴线条的图例

python - 将列表从 iPython 单元移动到数据文件中

javascript - 在对象数组中对动态键进行分组

algorithm - 查找固定长度排列的分块算法

r - 每组使用 2 种颜色进行绘图

python - "can' t escape _io.BufferedRandom to binary"试图将图像插入 BYTEA 列时

csv - "Object constructor"JMeter中的Beanshell错误

ruby - 使用 Ruby 从 CSV 解析数据?

Python:如何使相同类型的可比较的可哈希对象被 set/dict 视为单个对象?