【问题标题】:difference between `header = None` and `header = 0` in pandas熊猫中`header = None`和`header = 0`之间的区别
【发布时间】:2018-08-09 04:57:54
【问题描述】:

我正在编写代码以使用pandas 读取csv 文件,我看到了该包的一些奇怪功能。我的文件有我想忽略的列名,所以我使用header = 0 或'infer' 而不是None。但我看到了一些奇怪的东西。

当我使用None 并且想要获取特定列时,我只需要执行df[column_index],但是当我使用0 或'infer' 时,我需要执行df.ix[:,column_index] 来获取列,否则, 对于df[column_index] 我收到以下错误:

Traceback(最近一次调用最后一次):文件 “/home/sarvagya/anaconda3/envs/tf/lib/python3.6/site-packages/pandas/core/indexes/base.py”, 第 2525 行,在 get_loc 中 return self._engine.get_loc(key) 文件“pandas/_libs/index.pyx”,第 117 行,在 pandas._libs.index.IndexEngine.get_loc 文件中 “pandas/_libs/index.pyx”,第 139 行,在 pandas._libs.index.IndexEngine.get_loc 文件 “pandas/_libs/hashtable_class_helper.pxi”,第 1265 行,在 pandas._libs.hashtable.PyObjectHashTable.get_item 文件 “pandas/_libs/hashtable_class_helper.pxi”,第 1273 行,在 pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: column_index

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件“”,第 1 行,in 文件 “/home/sarvagya/anaconda3/envs/tf/lib/python3.6/site-packages/pandas/core/frame.py”, 第 2139 行,在 getitem 中 返回 self._getitem_column(key) 文件“/home/sarvagya/anaconda3/envs/tf/lib/python3.6/site-packages/pandas/core/frame.py”, 第 2146 行,在 _getitem_column 返回 self._get_item_cache(key) 文件“/home/sarvagya/anaconda3/envs/tf/lib/python3.6/site-packages/pandas/core/generic.py”, 第 1842 行,在 _get_item_cache 中 值 = self._data.get(item) 文件“/home/sarvagya/anaconda3/envs/tf/lib/python3.6/site-packages/pandas/core/internals.py”, 第 3843 行,在获取 loc = self.items.get_loc(item) 文件“/home/sarvagya/anaconda3/envs/tf/lib/python3.6/site-packages/pandas/core/indexes/base.py”, 第 2527 行,在 get_loc 中 return self._engine.get_loc(self._maybe_cast_indexer(key)) 文件“pandas/_libs/index.pyx”,第 117 行,在 pandas._libs.index.IndexEngine.get_loc 文件 “pandas/_libs/index.pyx”,第 139 行,在 pandas._libs.index.IndexEngine.get_loc 文件 “pandas/_libs/hashtable_class_helper.pxi”,第 1265 行,在 pandas._libs.hashtable.PyObjectHashTable.get_item 文件 “pandas/_libs/hashtable_class_helper.pxi”,第 1273 行,在 pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: column_index

有人可以帮忙吗?为什么会这样?

【问题讨论】:

    标签: python-3.x pandas csv dataframe


    【解决方案1】:

    使用带有标头的数据框时会出现差异,因此假设您的 DataFrame df 有标头!

    1. header=Nonepandas 自动将df 的第一行(这是实际的列名)分配给第一行,因此您的列不再有名称

    2. header=0,pandas 首先删除列名(标题),然后为它们分配新的列名(仅当您在加载文件时传递 names = [........])。 read_csv( filepath, header = 0 , names = ['....' , '....' ...])

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      看起来需要 2 个参数 - header=None 和 skiprows=1 如果要忽略默认的原始列名称 RangeIndex。

      因为如果在第一行中仅使用 header=None 会得到原始列名。

      而header=0 将第一行读取到DataFrame 的列名。

      示例:

      import pandas as pd
      
      temp=u"""a,b,c
      1,2,3
      4,5,6"""
      #after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
      df = pd.read_csv(pd.compat.StringIO(temp), header=0)
      print (df)
         a  b  c
      0  1  2  3
      1  4  5  6
      

      按位置选择:

      print (df.iloc[:, 1])
      0    2
      1    5
      Name: b, dtype: int64
      

      按列名选择:

      print (df['b'])
      
      0    2
      1    5
      Name: b, dtype: int64
      

      没有列名1,所以:

      打印 (df[1]) 关键错误:1


      df = pd.read_csv(pd.compat.StringIO(temp), header=None)
      print (df)
         0  1  2
      0  a  b  c
      1  1  2  3
      2  4  5  6
      
      df = pd.read_csv(pd.compat.StringIO(temp), header=None, skiprows=1)
      print (df)
         0  1  2
      0  1  2  3
      1  4  5  6
      
      print (df[1])
      0    2
      1    5
      Name: 1, dtype: int64
      

      【讨论】:

      • 我知道我需要使用skiprows。我不明白为什么我会收到错误
      • 所以在你的代码中df[1] 失败了?因为keyerror意味着没有column_index的列
      • column_index 仅用于推理。这里实际上有一个int 值,比如0 或1,所以如果它是df[1],那么keyError 就是1
      • 嗯,所以在代码中使用 header=None 和 df[1] 或 df[0] 不起作用?这真的很奇怪。但是如果使用header=0 是可以预期的,因为 csv 标头被转换为列名。
      • 不,反之亦然,如果header=None 则df[1] 有效。但不是header=0
      【解决方案3】:

      假设您有一个像 student.csv 这样的 csv 文件,其中第一行的列名。

          id class marks
      0   01 10    97
      1   02 9     85
      2   03 11    70
      

      如果你想读取这个 csv 文件,你可以这样做 -

      df = pd.read_csv('student.csv') 
      

      或

      df = pd.read_csv('student.csv', header=0)
      

      这两个语句将给出与上面相同格式的 csv 文件。

      但是如果你尝试使用这个 -

      df = pd.read_csv('student.csv', header=None)
      

      pandas 会假设您的文件中没有列名,并将其设为自己的并以这种格式打印 csv 文件。

          0   1    2
      0   id class marks
      1   01 10    97
      2   02 9     85
      3   03 11    70
      

      【讨论】:

        猜你喜欢
        • 2017-01-11
        • 2014-02-21
        • 2013-02-21
        • 1970-01-01
        • 2012-08-09
        • 2018-03-07
        • 1970-01-01
        • 2019-12-10
        • 1970-01-01
        相关资源
        最近更新 更多