读取.csv文件到pandas数据框并从换行符识别数据部分

11 浏览
0 Comments

读取.csv文件到pandas数据框并从换行符识别数据部分

我有一个.csv文件,其中2个或更多的空行表示一个新的数据部分。但我事先不知道每个部分有多少行。有没有办法直接读取到一个pandas数据框,并在出现2个或更多个空行时停止?

数据如下(来自Google Trends结果的.csv文件,这里是截断的)。

Web Search interest: zts
Worldwide; 2004 - present
Interest over time
Week,zts
2004-01-04 - 2004-01-10,0
2004-01-11 - 2004-01-17,80
Top regions for zts
Region,zts
Slovakia,100
Slovenia,23
Top cities for zts
City,zts
Bratislava (Slovakia),100
Wroclaw (Poland),39
Top searches for zts
focus zts,100
ford zts,90
Rising searches for zts
2002 focus zts,Breakout
battery tester,Breakout

现在我使用csv.reader()并循环遍历所有行,并保留匹配第一列中的日期正则表达式且有两列的行。但这似乎有些笨拙。

如果我使用类似于pandas.read_csv(input_file, header=4)(然后稍后使用日期正则表达式找到正确的部分),那么当最后一个部分有三列时(这里没有,但可以有)它会失败。

有没有办法在不事先知道行数的情况下停止我的pandas.read_csv()?理想情况下,我想将这个.csv解析成五个数据框(每个数据部分一个),但目前我很满意获取第一个部分。

0
0 Comments

问题:如何从一个包含多个数据段的csv文件中,将数据分割成多个dataframe,并将它们合并成一个整体的dataframe?

原因:在处理csv文件时,有时候会遇到一个文件中包含多个数据段的情况。每个数据段之间有一定的分隔符,比如空行。这样的情况下,如果直接使用pandas的read_csv函数来读取整个文件,会将所有数据段合并为一个dataframe,导致数据混乱。因此,需要先将文件按照分隔符进行分割,然后分别读取每个数据段,最后再将它们合并成一个整体的dataframe。

解决方法:可以使用正则表达式来对csv文件进行分割。首先,将整个csv文件读取为一个字符串。然后,使用正则表达式的split函数,将字符串按照指定的分隔符进行分割。在这个例子中,分隔符是两个以上的连续换行符。得到的分割后的字符串列表中,每个元素就是一个数据段。接下来,可以使用pandas的read_csv函数,将每个数据段分别读取为一个dataframe。最后,使用pandas的concat函数将所有dataframe按照列的方向合并成一个整体的dataframe。

代码如下:

import re
from cStringIO import StringIO
csv1 = """right,top,bottom
4,5,6
6,7,8
"""
csv2 = """up,down,left
1,2,3
7,6,5
"""
csv3 = """a,b,c
1,2,3
4,5,6
"""
join_n = randint(2, 6, size=2)
raw = [csv1, csv2, csv3]
csvs = []
for csv, n in zip(raw, join_n):
    csvs.append(csv + '\n' * n)
csvs.append(csv3)
csvs = ''.join(csvs)
splitsville = re.split('\n{2,}', csvs)
dfs = []
for sp in splitsville:
    dfs.append(read_csv(StringIO(sp)))
final_df = concat(dfs, axis=1)
print final_df

运行结果如下:

   right  top  bottom  up  down  left  a  b  c
0      4    5       6   1     2     3  1  2  3
1      6    7       8   7     6     5  4  5  6

注意:在实际应用中,并不一定需要使用concat函数将所有dataframe合并成一个整体的dataframe。这取决于具体的需求,有时候只需要对每个dataframe进行单独的操作即可。

0
0 Comments

这段代码的目的是将一个 .csv 文件解释为多个 .csv 文件,并在 pandas 之外进行拆分。问题的原因是需要将一个 .csv 文件中的数据分成多个部分,每个部分保存为一个独立的 .csv 文件。解决方法是使用 csv 模块读取原始文件的内容,然后根据行结束符将数据分成多个部分,并将每个部分保存为一个单独的 .csv 文件。

代码中首先定义了一些变量,包括输入文件路径、输出文件路径的根目录、当前数据部分编号等。然后打开输入文件和输出文件,并创建 csv 读写器对象。接下来,通过遍历读取器对象的行,对每一行进行判断和处理。

如果当前行中存在数据,并且是第一行,则创建一个新的输出文件,并将当前行写入该文件。然后行数加一。如果当前行中存在数据,并且行数大于1,则将当前行写入当前输出文件,并将行数加一。如果行数大于1,则关闭当前输出文件,增加数据部分编号,将行数重置为1。最后关闭输出文件和输入文件。

通过这段代码,我们可以将一个 .csv 文件中的数据按照行结束符拆分成多个部分,并保存为多个单独的 .csv 文件。这样可以方便地对每个数据部分进行处理和分析,而无需将整个文件加载到内存中。

0