我尝试将 CSV 文件读入 pandas 数据框并选择一列,但不断出现关键错误。
文件读取成功,我可以在 iPython 笔记本中查看数据帧,但是当我想选择第一列以外的任何列时,它会引发关键错误。
我正在使用此代码:
import pandas as pd
transactions = pd.read_csv('transactions.csv',low_memory=False, delimiter=',', header=0, encoding='ascii')
transactions['quarter']
KeyError Traceback (most recent call last)
Cell In[10], line 2
1 transactions = pd.read_csv('c:/Users/trenton/Downloads/transactions.csv',low_memory=False, delimiter=',', header=0, encoding='ascii')
----> 2 transactions['quarter']
File ~\anaconda3\envs\py312\Lib\site-packages\pandas\core\frame.py:3896, in DataFrame.__getitem__(self, key)
3894 if self.columns.nlevels > 1:
3895 return self._getitem_multilevel(key)
-> 3896 indexer = self.columns.get_loc(key)
3897 if is_integer(indexer):
3898 indexer = [indexer]
File ~\anaconda3\envs\py312\Lib\site-packages\pandas\core\indexes\base.py:3797, in Index.get_loc(self, key)
3792 if isinstance(casted_key, slice) or (
3793 isinstance(casted_key, abc.Iterable)
3794 and any(isinstance(x, slice) for x in casted_key)
3795 ):
3796 raise InvalidIndexError(key)
-> 3797 raise KeyError(key) from err
3798 except TypeError:
3799 # If we have a listlike key, _check_indexing_error will raise
3800 # InvalidIndexError. Otherwise we fall through and re-raise
3801 # the TypeError.
3802 self._check_indexing_error(key)
KeyError: 'quarter'
transactions.csv
完整数据文件
product_id, customer_id, store_id, promotion_id, month_of_year, quarter, the_year, store_sales, store_cost, unit_sales, fact_count
1,157,24,1869,12,'Q4',1997,'8.5500','2.9925','3.0000',1
1,456,15,0,6,'Q2',1997,'11.4000','4.3320','4.0000',1
1,638,11,0,9,'Q3',1997,'8.5500','2.9925','3.0000',1
1,916,7,0,4,'Q2',1997,'11.4000','4.9020','4.0000',1
1,923,15,0,7,'Q3',1997,'8.5500','2.7360','3.0000',1
1,1312,3,0,5,'Q2',1997,'8.5500','3.6765','3.0000',1
1,1565,24,0,9,'Q3',1997,'8.5500','4.1895','3.0000',1
1,2270,11,0,11,'Q4',1997,'8.5500','4.0185','3.0000',1
1,3065,3,0,11,'Q4',1997,'5.7000','2.5080','2.0000',1
1,3441,3,0,8,'Q3',1997,'8.5500','3.4200','3.0000',1
1,3528,17,0,10,'Q4',1997,'8.5500','3.8475','3.0000',1
1,4461,11,0,4,'Q2',1997,'8.5500','2.9925','3.0000',1
使用
sep='\s*,\s*'
以便您可以处理列名称中的空格:
transactions = pd.read_csv('transactions.csv', sep=r'\s*,\s*',
header=0, encoding='ascii', engine='python')
或者,您可以确保 CSV 文件中没有未加引号的空格并使用您的命令(不变)
证明:
print(transactions.columns.tolist())
输出:
['product_id', 'customer_id', 'store_id', 'promotion_id', 'month_of_year', 'quarter', 'the_year', 'store_sales', 'store_cost', 'unit_sales', 'fact_count']
如果您需要从数据框中选择多列,请使用 2 对方括号 例如。
df[["product_id","customer_id","store_id"]]
我遇到了同样的问题,从 CSV 读取后过滤列时出现关键错误。
这些问题的主要原因是 CSV 文件中的额外的初始空格。 (可在您上传的 CSV 文件中找到,例如
, customer_id, store_id, promotion_id, month_of_year,
)
为了证明这一点,你可以尝试
print(list(df.columns))
并且列名必须是['product_id', ' customer_id', ' store_id', ' promotion_id', ' month_of_year', ...]
。
解决这个问题的直接方法是在
pd.read_csv()
中添加参数,例如:
pd.read_csv('transactions.csv',
sep = ',',
skipinitialspace = True)
如果键与任何数据帧列名称“完全”不匹配,通常会出现键错误:
您也可以尝试:
import csv
import pandas as pd
import re
with open (filename, "r") as file:
df = pd.read_csv(file, delimiter = ",")
df.columns = ((df.columns.str).replace("^ ","")).str.replace(" $","")
print(df.columns)
在
pd.read_csv()
中给出 CSV 文件的完整路径。这对我有用。
数据集用“,”分割时,会创建开头带有空格的特征。使用正则表达式删除空格可能会有所帮助。
暂时我这样做了:
label_name = '标签'
使用 sep='\s*,\s*' 将解决该问题。可能还有更多与按键错误相关的问题。
dataset = pd.read_csv('dataset.csv', sep=r'\s*,\s*',
header=0, encoding='ascii', engine='python')
找到了带有多个示例的参考文献http://www.pythonpandas.com/how-to-fix-keyerror-in-pandas/