熊猫中的“标头=无”和“标头= 0”之间的区别

时间:2018-08-09 04:57:55

标签: python-3.x pandas csv dataframe

我正在编写代码以使用csv来读取pandas文件,并且看到了该程序包的某些奇怪功能。我的文件具有要忽略的列名,因此我使用header = 0'infer'而不是None。但是我看到了一些奇怪的东西。

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

  

回溯(最近通话最近):文件   “ /home/sarvagya/anaconda3/envs/tf/lib/python3.6/site-packages/pandas/core/indexes/base.py”,   第2525行,位于get_loc中       返回self._engine.get_loc(key)文件“ pandas / _libs / index.pyx”,第117行,在pandas._libs.index.IndexEngine.get_loc文件中   第139行中的“ pandas / _libs / index.pyx”   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

     

在处理上述异常期间,发生了另一个异常:

     

回溯(最近一次通话最后一次):文件“”,第1行,在      文件   “ /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”,   _getitem_column中的第2146行       返回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中       返回self._engine.get_loc(self._maybe_cast_indexer(key))文件“ pandas / _libs / index.pyx”,第117行,在   pandas._libs.index.IndexEngine.get_loc文件   第139行中的“ pandas / _libs / index.pyx”   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

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

2 个答案:

答案 0 :(得分:0)

如果要忽略默认列header=None的原始列名称,则似乎需要两个参数-skiprows=1RangeIndex

因为如果仅在第一行中使用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])   KeyError: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

答案 1 :(得分:0)

使用带标头的数据框时,差异会弹出,因此可以说您的数据框df有标头!

  1. header=None熊猫自动将df的第一行(即实际的列名)分配给第一行,因此您的列不再具有名称

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

希望有帮助!