【问题标题】:Prevent pandas read_csv treating first row as header of column names防止 pandas read_csv 将第一行视为列名的标题
【发布时间】:2017-04-07 18:30:32
【问题描述】:

我正在使用pd.read_csv 阅读pandas DataFrame。我想将第一行保留为数据,但它不断转换为列名。

  • 我尝试了header=False,但这只是将其完全删除。

(请注意我的输入数据:我有一个字符串 (st = '\n'.join(lst)),我将其转换为类似文件的对象 (io.StringIO(st)),然后从该文件对象构建 csv。)

【问题讨论】:

    标签: python pandas csv header-row


    【解决方案1】:

    您可以设置自定义列名以防止这种情况:

    假设您的数据集中有两列,那么:

    df = pd.read_csv(your_file_path, names = ['first column', 'second column'])
    

    如果你有多个列名,你也可以通过程序生成列名,并且可以在 names 属性前面传递一个列表。

    【讨论】:

      【解决方案2】:

      如果您使用pd.ExcelFile 来读取所有的 excel 文件表,那么:

      df = pd.ExcelFile("path_to_file.xlsx")    
      df.sheet_names                       # Provide the sheet names in the excel file
      
      df = df.parse(2, header=None)        # Parsing the 2nd sheet in the file with header = None
      df
      

      输出:

         0  1  
      0  a  b
      1  1  1
      2  0  1
      3  5  2
      

      【讨论】:

        【解决方案3】:

        您希望 header=NoneFalse 类型提升为 int0 请参阅 docs 强调我的:

        header : 整数或整数列表,默认“推断”行号用作 列名和数据的开头。默认行为就像 如果没有传递名称,则设置为 0,否则设置为 None。显式传递 header=0 能够替换现有名称。标题可以是一个列表 指定列上多索引的行位置的整数 例如[0,1,3]。未指定的中间行将被跳过 (例如,跳过此示例中的 2)。请注意,此参数忽略 如果skip_blank_lines=True,则注释行和空行,所以header=0 表示数据的第一行而不是文件的第一行。

        你可以看到行为的不同,首先是header=0

        In [95]:
        import io
        import pandas as pd
        t="""a,b,c
        0,1,2
        3,4,5"""
        pd.read_csv(io.StringIO(t), header=0)
        
        Out[95]:
           a  b  c
        0  0  1  2
        1  3  4  5
        

        现在None:

        In [96]:
        pd.read_csv(io.StringIO(t), header=None)
        
        Out[96]:
           0  1  2
        0  a  b  c
        1  0  1  2
        2  3  4  5
        

        请注意,在最新版本 0.19.1 中,这现在将引发 TypeError

        In [98]:
        pd.read_csv(io.StringIO(t), header=False)
        

        TypeError:将 bool 传递给 header 无效。使用 header=None 表示没有 header 或 header=int 或类似列表的整数来指定行 增加列名

        【讨论】:

          【解决方案4】:

          我认为你需要参数header=Noneread_csv

          示例:

          import pandas as pd
          from pandas.compat import StringIO
          
          temp=u"""a,b
          2,1
          1,1"""
          
          df = pd.read_csv(StringIO(temp),header=None)
          print (df)
             0  1
          0  a  b
          1  2  1
          2  1  1
          

          【讨论】:

          • 这只是完全删除第一行,它不会将其视为数值。
          猜你喜欢
          • 1970-01-01
          • 2019-08-10
          • 2020-03-26
          • 2020-02-19
          • 2020-04-28
          • 2021-05-31
          • 2012-08-19
          • 1970-01-01
          相关资源
          最近更新 更多