选择 pandas 列时出现 KeyError

问题描述 投票:0回答:7

我尝试将 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
python pandas keyerror
7个回答
102
投票

使用

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']

12
投票

如果您需要从数据框中选择多列,请使用 2 对方括号 例如。

df[["product_id","customer_id","store_id"]]

12
投票

我遇到了同样的问题,从 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)

参考:https://stackoverflow.com/a/32704818/16268870


3
投票

如果键与任何数据帧列名称“完全”不匹配,通常会出现键错误:

您也可以尝试:

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)

0
投票

pd.read_csv()
中给出 CSV 文件的完整路径。这对我有用。


-1
投票

数据集用“,”分割时,会创建开头带有空格的特征。使用正则表达式删除空格可能会有所帮助。

暂时我这样做了:

label_name = '标签'


-1
投票

使用 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/

© www.soinside.com 2019 - 2024. All rights reserved.