我有一个包含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)
找不到如何进一步做...
答案 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年在技术上分组,但这个想法是一样的。