使用pandas将包含多个表格的CSV文件转换为一个数据帧。
使用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中重新排列数据来避免这个循环?
使用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文件转换为一个数据框,方便进行后续的数据处理和分析。同时,这种方法也提高了代码的效率,减少了处理过程中的重复工作量。