Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按25个块对CSV中的行进行分组_Python_Csv_Grouping - Fatal编程技术网

Python 按25个块对CSV中的行进行分组

Python 按25个块对CSV中的行进行分组,python,csv,grouping,Python,Csv,Grouping,我有一个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行: 1

我有一个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) 
找不到进一步的方法

您可以使用:

屈服

(1900, 10)
(1925, 43)
(1950, 15)
请注意,1900年至1925年(含)的跨度为26年,而不是25年。所以 如果你想对25年进行分组,考虑到你报告总数的方式,你可能需要半开放区间
(1900,1925)


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

,这是我的方法。它肯定不是最吸引人的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        
如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
o=打开('dates\u dist.csv','rU')
lines=o.read().split(“\n”)#创建一个包含文件每一行的列表
out_dict={}
当前日期=0;
当前计数=0
chunk_sz=25年
如果len(线)>0:
行分割=行[0]。分割(“,”)
起始年=整数(行分割[0])
当前计数=0
#迭代文件的每一行
对于行中的行:
#按逗号拆分以获得年份和计数。
#第[0]行为年份,第[1]行为计数。
行分割=行分割(“,”)
当前年份=整数(行分割[0])
时间增量=当前年份开始年份

如果time_delta您可以创建一个虚拟列,并在进行整数除法后按其分组:

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年进行技术分组的,但想法是一样的。

你可以对此添加一个解释-我相信OP会很感激。@unutbu-大概
csv.reader
会这样创建:
csv.reader(o,delimiter='',skipinitialspace=True)
或类似的?(以适应非标准和可变的空格分隔符)。@mhawke:是的;由于OP调用
csv.reader
的方式似乎没有问题,我没有更改该代码以适应数据的显示方式。
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