首页 > 解决方案 > 如何使用python和pandas将多列组合成一个长列

问题描述

大家好,我目前正在处理如下数据: 原始数据文件示例

共有51个文件,每个文件有800多个摆动列,例如(时间,ID,x1,x2,ID,x1,x2,...),这些列都是未标记的。在文件中,每一行都有不同的列数,如下所示:一个数据文件的形状

我需要将所有 51 个文件合并到一个文件中,然后像这样垂直堆叠列: 输出文件示例

因此,对于每个时间戳,每个学生都会有一个特定的行,其中包含他们的位置 x,y。

谁能帮我解决这个问题,谢谢

我使用以下代码来合并具有不同列的 CSV 文件,但输出文件的大小是原始文件的两倍(例如 100MB VS 50MB)。我的方法是使用最大列数组合文件并扩展到每一行。但是,这种方法会在数据中产生大量缺失值,从而增加输出文件的大小。

import os
import glob
import pandas as pd

def concatenate(indir="C:\Test Files",outfile="F:\Research Assitant\PROJECT_Position Data\Test File\Concatenate.csv"):
    os.chdir(indir)
    fileList=glob.glob("*.csv")
    dfList=[]
    for filename in fileList:
        ### Loop over each line
        with open(filename, 'r') as f:
            ### Skip first four lines
            for _ in range(4):
                next(f)
            ### Get the numbers of columns in each line
            col_count = [ len(l.split(",")) for l in f.readlines() ]

        ### Read the current csv file
        df = pd.read_csv(filename, header=None, delimiter=",", names=range(max(col_count)), 
                         skiprows=4, keep_default_na=False, na_values=[""])
        ### Append to the list
        dfList.append(df)

    concatDf=pd.concat(dfList,axis=0)
    concatDf.to_csv(outfile,index=None)

有什么办法可以减小输出文件的大小?还是一种更有效的方式来处理 python 中的异构 CSV 文件?

合并所有 CSV 文件后如何垂直堆叠列?

标签: pythonpandas

解决方案


    with open(os.path.join(working_folder, file_name)) as f:
    student_data = []
    for line in f:
        row = line.strip().split(",")
        number_of_results = round(len(row[1:]) / 4) # if we do not count time column, data repeats every 4 times
        time_column = row[0]
        results = row[1:]
        for i in range(number_of_results):
            data = [time_column] + results[i*4: (i+1)*4]
            student_data.append(data)
df = pd.DataFrame(student_data, columns=["Time", "ID", "Name", "x1", "x2"])
df

推荐阅读