我有一个包含 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/