我正在编写代码以使用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
有人可以帮忙吗?为什么会这样?
答案 0 :(得分:0)
如果要忽略默认列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]) 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
有标头!
header=None
熊猫自动将df
的第一行(即实际的列名)分配给第一行,因此您的列不再具有名称
header=0
,pandas首先删除列名(标题),然后为它们分配新的列名(仅当加载文件时传递名称= [........]时) 。
read_csv( filepath, header = 0 , names = ['....' , '....' ...])
希望有帮助!