【问题标题】:read csv and Iterate through 10 row blocks读取 csv 并遍历 10 个行块
【发布时间】:2020-06-01 19:14:13
【问题描述】:

我正在尝试读取 CSV 文件并遍历 10 行块。 数据很不寻常,有两列和 10 行块。

57485 行 x 2 列,格式如下:

Grid-ref=   1,148
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630
 3020 2820 3040 2880 1740 1360  980  990 1410 1770 2580 2630

Grid-ref=   1,311
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450
  490  290  280  230  200  250  440  530  460  420  530  450

Grid-ref=   1,312
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410
  460  280  260  220  190  240  430  520  450  400  520  410

每 10 行包含一个网格参考和两个记录 X/Y 参考。 网格参考和 X 值在第 1 列,Y 值在第 2 列,然后 9 行 12 列在第 1 列。

The blocks (x) 0 - 9, represent months (Jan - December
The blocks (y) 0 - 9, represent years (1991-2000)

So for 0, is 1991 
3020 is January 1991, 2820 is February 1991

Grid-ref = 1 (X),148 (Y)

下面的代码读取了 10 行,但在后面的所有 10 行块中不断重复第一行??

我不明白为什么它一直重复第一行? 任何解决此问题的建议将不胜感激..

## Python 3.6

## Read in the datasets (they are in CSV format) 
data = pd.read_csv('cru-ts-2-10-1991-2000-cutdown.csv', skiprows=5, na_values =  [-999] )

## View data    >> 57485 rows x 2 columns
#print(data)
#print(len(data))   ## len = 57485

## header = pd.MultiIndex.from_product([['Grid-ref', 'Xref', 'Yref'], ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ] ])

# df = pd.DataFrame(np.random.randn(10, 11), 
# index=['1991','1992','1993','1994','1995', '1996', '1997', '1998', '1999', '2000', '2001'], 
#  columns=header)

# print(data.head(10)) ## prints chunks of 10 rows

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in range(0, len(seq), size))

for group in chunker(data, 10):
    print(group)

前两块:

                                      Grid-ref=   1   148
0   3020 2820 3040 2880 1740 1360  980  990 1410 ...   NaN
1   3020 2820 3040 2880 1740 1360  980  990 1410 ...   NaN
2   3020 2820 3040 2880 1740 1360  980  990 1410 ...   NaN
3   3020 2820 3040 2880 1740 1360  980  990 1410 ...   NaN
4   3020 2820 3040 2880 1740 1360  980  990 1410 ...   NaN
5   3020 2820 3040 2880 1740 1360  980  990 1410 ...   NaN
6   3020 2820 3040 2880 1740 1360  980  990 1410 ...   NaN
7   3020 2820 3040 2880 1740 1360  980  990 1410 ...   NaN
8   3020 2820 3040 2880 1740 1360  980  990 1410 ...   NaN
9   3020 2820 3040 2880 1740 1360  980  990 1410 ...   NaN
                                        Grid-ref=   1    148
10                                      Grid-ref=   1  311.0
11    490  290  280  230  200  250  440  530  460 ...    NaN
12    490  290  280  230  200  250  440  530  460 ...    NaN
13    490  290  280  230  200  250  440  530  460 ...    NaN
14    490  290  280  230  200  250  440  530  460 ...    NaN
15    490  290  280  230  200  250  440  530  460 ...    NaN
16    490  290  280  230  200  250  440  530  460 ...    NaN
17    490  290  280  230  200  250  440  530  460 ...    NaN
18    490  290  280  230  200  250  440  530  460 ...    NaN
19    490  290  280  230  200  250  440  530  460 ...    NaN

【问题讨论】:

  • 请发布您的 CSV 样本。
  • 您希望表格是什么样的?网格参考是否应该集成为一列? pandas 适用于统一的柱状数据,而这个数据集并不完全如此。您可能希望使用常规的 python csv 模块进行预处理,以获取您想要的数据作为要交给 pandas 的列表或作为已转换为您想要的形式的中间文件。
  • 上面的前几块数据我已经添加了,无法添加到cmets中。
  • 您好,我想提取 Grid-ref,X/Y,然后创建一个带有 Grid-ref,X/Y,日期的 DataFrame。对于 0 = 1991 年 1 月 = 3020,1991 年 2 月 = 2820

标签: python python-3.x pandas csv dataframe


【解决方案1】:

Pandas 适用于统一的列数据。如果您的输入不统一,您可以对其进行预处理,然后加载数据框。这很简单,您需要做的就是扫描网格标题并将其删除。由于数据本身是数字,由空格分隔,一个简单的拆分将解析它。此示例创建了一个列表,但如果数据集很大,则改为写入中间文件可能是合理的。

import csv
import re
import pandas as  pd

grid_re = re.compile(r"Grid-ref=\s*(\d+),(\d+)")

with open('test.csv') as fobj:
    table = []
    try:
        while True:
            # find next block
            for line in fobj:
                match = grid_re.search(line)
                if match:
                    grid_xy = list(match.groups())
                    break
            else:
                raise StopIteration()
            for _ in range(10):
                line = next(fobj)
                # add row plus grid columns
                table.append(line.strip().split() + grid_xy)
    except StopIteration:
        pass

df = pd.DataFrame(table)
print(df)

【讨论】:

  • 谢谢,非常感谢。使用错误的库,例如将汽油放入柴油中。
  • 我运行了代码,但得到了一个空的 DataFrame。 for line in fobj:这会打印块,并附加一行。 match = grid_re.search(line) 从第 2 列返回 None
猜你喜欢
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
相关资源
最近更新 更多