使用pandas将包含多个表格的CSV文件转换为一个数据帧。

13 浏览
0 Comments

使用pandas将包含多个表格的CSV文件转换为一个数据帧。

我想解释从机器输出的数据,这些数据被捆绑在一个CSV文件中。我想要输出一个更易于分析的大表。

输入数据可能如下所示:

标记,

信息1,信息2 \r\n

列1,列2,列3,列4,列5,列A,列B,列C \r\n

NULL,2e15,-222,信息,字符串,0.17,b,c \r\n

... \r\n

标记,

信息3,信息4 \r\n

列1,列5,列A,列B,列D \r\n

文本,foo,0.17,-1e-12,字符串 \r\n

换句话说,这些逗号分隔的数据表由一些标记字符串来区分,描述了下面的内容。这些表比信息行有更多的列。这些表有列标题,并且每个表的列标题都不相同。这些表的行数不相等。

我希望输出包含在单独列中的表信息,并将所有不同的表列连接起来。

我的当前代码运行得还不错,但感觉有些粗糙,我想知道是否可以直接从pandas.read_csv()中完成所有操作:

f = "test.csv"
locfile = locfile = open(f)
d={} #创建一个空字典来加载数据帧
j=0 #我使用这个计数器来确定每个CSV文件中有多少个表
read_df = pd.read_csv(f, header=None, sep='\n') #使用pandas读取数据
test_df = read_df.loc[read_df[0].str.contains('marker')] #使用.loc找出分隔表的表达式
step_holder = list(test_df.index.values) #存储每个表的第一行
step_holder.append(read_df.shape[0]) #添加最后一个表的底行
difference_step = [j-i for i, j in zip(step_holder[:-1], step_holder[1:])]#确定每个表的表长
for line in locfile:
    if len(line)>1 and line.split(",")[0] == "marker": #收集标题信息
        nextline= next(locfile)
        nextline_row = re.split(';|,|\*|\n',nextline)
        info1 = nextline_row[0]
        info2 = nextline_row[1] 
        header_info = [info1,info2]
        j+=1      
    if len(line)>1 and line.split(",")[0] == "col1": #收集实际处理信息
        line_split = re.split(';|,|\*',line) #这一行将形成标题信息
        headers = ["info1","info2"]
        headers.extend(line_split)
        l = [] #创建一个空列表来存储数据表中的所有行
        for k in range(difference_step[j-1]): 
            row = []
            nextline= next(locfile) 
            nextline_row = re.split(';|,|\*',nextline)
            row = header_info+nextline_row
            l.append(row)            
        df = pd.DataFrame(l,columns=headers) #将行列表转换为数据帧
        d[f+str(j)] = df #将每个数据帧添加到带有唯一ID的字典中    
df = pd.concat([v for k,v in d.items()]) #将字典中的所有数据帧连接起来
df.to_csv(outputf) 

有没有办法通过直接在pandas中重新排列数据来避免这个循环?

0
0 Comments

使用pandas将一个包含多个表格的CSV文件转换为一个数据框的原因是,原始的CSV文件包含了多个表格,而我们希望将这些表格整合到一个数据框中进行分析和处理。目前的代码可以实现这一目标,但需要改进以提高效率。

解决方法是使用pandas库中的read_csv函数读取CSV文件,并使用names参数指定列数。然后,使用isin和cumsum函数对数据框中的特定列进行处理,以确定表格的起始位置。最后,使用groupby函数将数据框拆分为多个子数据框,并将其存储在一个字典中。

下面是完整的解决方法代码:

import pandas as pd
# 指定CSV文件路径
file_loc = "test.csv"
# 指定标记列
list = ['marker']
# 使用read_csv函数读取CSV文件,并指定列数
read_df = pd.read_csv(file_loc, header=None, names=range(60))
# 使用isin和cumsum函数处理数据框中的特定列,确定表格的起始位置
groups = read_df[0].isin(list).cumsum()
# 使用groupby函数将数据框拆分为多个子数据框,并存储在字典中
tables = {'process'+str(k): g.iloc[0:] for k,g in read_df.groupby(groups)}

然后,可以使用for循环对tables中的数据框进行进一步的处理和分析。

通过以上代码,我们可以轻松地将一个包含多个表格的CSV文件转换为一个数据框,方便进行后续的数据处理和分析。同时,这种方法也提高了代码的效率,减少了处理过程中的重复工作量。

0