Python 3.x pandas read_csv,数据和标题位于交替列中

Python 3.x pandas read_csv,数据和标题位于交替列中,python-3.x,pandas,csv,Python 3.x,Pandas,Csv,我有一个生成的CSV文件 没有标题 在每一行中交替出现标题和数据(标题不会随行变化) 例如: 在我看来,这种格式是多余和麻烦的(我不明白为什么有人会用这种格式生成文件)。相同数据的正常/正常CSV(我可以使用pd.read\u CSV()直接读取): 我的问题是,如何将原始数据读取到pd数据框中?现在,我执行读取\u csv,然后删除所有备用列: df=pd.read_csv(file, header=None) df=df[range(1, len(df.columns), 2] 问题是我没

我有一个生成的CSV文件

  • 没有标题
  • 在每一行中交替出现标题和数据(标题不会随行变化)
  • 例如:

    在我看来,这种格式是多余和麻烦的(我不明白为什么有人会用这种格式生成文件)。相同数据的正常/正常CSV(我可以使用
    pd.read\u CSV()
    直接读取):

    我的问题是,如何将原始数据读取到pd数据框中?现在,我执行
    读取\u csv
    ,然后删除所有备用列:

    df=pd.read_csv(file, header=None)
    df=df[range(1, len(df.columns), 2]
    
    问题是我没有得到标题,除非我特别指定它们


    是否有一种更简单的方法告诉熊猫,该格式的每一行都有数据和标题?

    通过索引选择列,并使用get first row和pair值设置新列名称(假设pair columns具有与示例数据中相同的值):


    通过在中建立索引来选择列,并使用get first row和pair值设置新列名称(假设pair列具有与示例数据中相同的值):


    我没有进行测量,但我认为在筛选感兴趣的内容之前读取整个文件(冗余标题和实际数据)可能会有问题。因此我尝试利用可选参数
    nrows
    usecols
    ,以(希望)限制处理CSV输入文件所需的内存量

    # --- Utilities for generating test data ---
    import random as rd
    
    def write_csv(file, line_count=100):
        with open(file, 'w') as f:
            r = lambda : rd.randrange(100);
            for i in range(line_count):
                line = f"imageId,{i},feat1,{r()},feat2,{r()},feat,{r()}\n"
                f.write(line)
    
    file = 'text.csv'
    
    # Generate a small CSV test file
    write_csv(file, 10)
    
    # --- Actual answer ---
    import pandas as pd
    
    # Read columns of the first row
    dfi = pd.read_csv(file, header=None, nrows=1)
    ncols = dfi.size
    
    # Read data columns
    dfd = pd.read_csv(file, header=None, usecols=range(1, ncols, 2))
    dfd.columns = dfi.iloc[0, ::2].to_list()
    print(dfd)
    

    我没有进行测量,但我认为在筛选感兴趣的内容之前读取整个文件(冗余标题和实际数据)可能会有问题。因此我尝试利用可选参数
    nrows
    usecols
    ,以(希望)限制处理CSV输入文件所需的内存量

    # --- Utilities for generating test data ---
    import random as rd
    
    def write_csv(file, line_count=100):
        with open(file, 'w') as f:
            r = lambda : rd.randrange(100);
            for i in range(line_count):
                line = f"imageId,{i},feat1,{r()},feat2,{r()},feat,{r()}\n"
                f.write(line)
    
    file = 'text.csv'
    
    # Generate a small CSV test file
    write_csv(file, 10)
    
    # --- Actual answer ---
    import pandas as pd
    
    # Read columns of the first row
    dfi = pd.read_csv(file, header=None, nrows=1)
    ncols = dfi.size
    
    # Read data columns
    dfd = pd.read_csv(file, header=None, usecols=range(1, ncols, 2))
    dfd.columns = dfi.iloc[0, ::2].to_list()
    print(dfd)
    

    可能有一些模糊的业务需求以这种方式定义了csv,没有文档或指南吗?如果列一致,下面的答案会很好。可能有一些模糊的业务需求以这种方式定义了csv,没有文档吗使用它的提示或指导?如果列一致,那么下面的答案将很有效。您似乎在
    df=pd.read\u csv(文件,标题=None)上构建解决方案
    。请原谅我可能愚蠢的问题:
    pd.read\u csv
    是否包含一些懒惰的机制,这些机制一开始不会消耗所有冗余头的内存?@Wolf-老实说,不知道。我对熊猫世界比较陌生:你能确认我的回答显示了一种资源消耗较少的方法吗?你似乎是基于
    df构建解决方案的=pd.read\u csv(文件,标题=无)
    。请原谅我可能愚蠢的问题:
    pd.read\u csv
    是否包含一些懒惰的机制,这些机制一开始不会消耗所有冗余头的内存?@Wolf-老实说,不知道。我对熊猫世界比较陌生:你能确认我的回答显示了一种资源消耗较少的方法吗?我想,如果你要逐行阅读的话行,您也可以创建数据帧,而不是添加新的磁盘写入和读取。我认为,如果您要逐行读取数据帧,您也可以创建数据帧,而不是添加新的磁盘写入和读取。
    #default headers
    df = pd.read_csv(file, header=None)
    
    df1 = df.iloc[:, 1::2]
    df1.columns = df.iloc[0, ::2].tolist()
    print (df1)
       imageId  feat1  feat2  feat
    0        0     30     34    90
    1        1      0      4    89
    2        2      3      3    80
    
    # --- Utilities for generating test data ---
    import random as rd
    
    def write_csv(file, line_count=100):
        with open(file, 'w') as f:
            r = lambda : rd.randrange(100);
            for i in range(line_count):
                line = f"imageId,{i},feat1,{r()},feat2,{r()},feat,{r()}\n"
                f.write(line)
    
    file = 'text.csv'
    
    # Generate a small CSV test file
    write_csv(file, 10)
    
    # --- Actual answer ---
    import pandas as pd
    
    # Read columns of the first row
    dfi = pd.read_csv(file, header=None, nrows=1)
    ncols = dfi.size
    
    # Read data columns
    dfd = pd.read_csv(file, header=None, usecols=range(1, ncols, 2))
    dfd.columns = dfi.iloc[0, ::2].to_list()
    print(dfd)