代码之家  ›  专栏  ›  技术社区  ›  Husain

从单个.csv文件中提取多个数据帧

  •  0
  • Husain  · 技术社区  · 2 年前

    我有一个包含多个数据帧的文件(每个数据帧都有自己的变量),我想从这个文件中提取所有数据帧并将其保存在单独的文件中 有办法用熊猫做到这一点吗?

    df.txt

       col1,  col2,
    0,     0,   NaN,
    1,     1,   NaN,
    2,     2,   2.0,
    3,     3,   3.0,
       col3,  col4, col5,
    4,     0,   1, 0,
    5,     1,   NaN, 1,
       col6,  col7,  
    6,     0,   NaN, 
    7,     1,   3, 
    
    

    期望结果:

    df1.csv

       col1,  col2,
    0,     0,   NaN,
    1,     1,   NaN,
    2,     2,   2.0,
    3,     3,   3.0,
    

    df2.csv

       col3,  col4, col5,
    4,     0,   1, 0,
    5,     1,   NaN, 1,
    

    df3.csv

       col6,  col7,  
    6,     0,   NaN, 
    7,     1,   3, 
    
    
    0 回复  |  直到 2 年前
        1
  •  3
  •   qaziqarta    2 年前

    在pandas中无法直接做到这一点,但如果你知道如何识别文件中新数据帧的起始行,你就可以很容易地做到。 如果文件看起来真的像你发布的,并且一个新的数据帧以一些空格开头(也可以是一个制表符),那么以下代码将为文件中的每个数据帧创建新文件。

    import re
    
    
    def create_csv(index, lines):
        with open(f"dfs{index}.csv", "w") as new_file:
            new_file.writelines(lines)
    
    
    if __name__ == "__main__":
        with open("df.txt", "r") as f:
            lines = f.readlines()
            df_start_indexes = []
            for i, l in enumerate(lines):
                if re.match(r"\s", l):
                    df_start_indexes.append(i)
    
            print(df_start_indexes)
            for df_i, start_line in enumerate(df_start_indexes):
                end_line = df_start_indexes[df_i + 1] if len(df_start_indexes) > df_i + 1 else None
                create_csv(df_i, lines[start_line:end_line])
    
        2
  •  1
  •   qaziqarta    2 年前
    df = pd.read_csv('df.txt', header=None)
    
    csv_starts = df.loc[df[0].str.strip().str.startswith('col')].index.to_list()
    for i,(a,b) in enumerate(zip(csv_starts, csv_starts[1:]+[None])):
        df.iloc[a:b].to_csv(f'df{i}.csv', index=False, header=False)
    
    1. 将整个文件读取为 csv ,但其中没有逗号,因此它将是一个1列DataFrame:

      df=pd.read_csv('df.txt',header=None)

    2. 获取新文件断点的索引-具有以下内容的行 col -其中的名字:

      csv_starts=df.loc[df[0].str.strip().str.startswith('col')].index.to_list()

    3. 构建索引范围并将其保存到文件:

      对于枚举(zip(csv_starts,csv_sstarts[1:]+[无])中的i,(a,b): df.iloc[a:b].to_csv(f'df{i}.csv',索引=False,标头=False)