代码之家  ›  专栏  ›  技术社区  ›  Alex_P

python中的数据帧切片失败

  •  1
  • Alex_P  · 技术社区  · 7 年前

    我想用python分割数据。切割数据帧的非常基本的任务向我抛出了意外的错误。

    我的代码是:

    import pandas as pd
    
    test_file = pd.read_csv("C:/Users/Lenovo/Desktop/testfile.csv")
    test_select = test_file[["Category", "Shop"]]
    print(test_select[1,1])
    

    代码 print(test_select[1,1]) 应显示第二列的第二行。

    错误消息:

    在pandas.libs.hashtable.pyobjecthashtable.get_item中,第1500行的文件“pandas libs\hashtable_class_helper.pxi” 键错误:(1,1)

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

    回溯(最近一次呼叫的最后一次): 文件“c:/users/lenovo/.pycharmce2018.1/config/scrates/dictionary.py”,第8行,in 打印(H_选择[1,1]) 文件“C:\Users\Lenovo\PycharmProjects\MindNotez\venv\lib\site packages\pandas\core\frame.py”,第2688行,in 格雷特姆 返回self._getitem_列(键) 文件“C:\Users\Lenovo\PycharmProjects\MindNotez\venv\lib\site packages\pandas\core\frame.py”,第2695行,在“getitem”列中 返回自我。获取项目缓存(键) 文件“C:\Users\Lenovo\PycharmProjects\MindNotez\venv\lib\site packages\pandas\core\generic.py”,第2489行,位于GeT_Item_缓存中 values=self.\u data.get(项) GET中的文件“C:\Users\Lenovo\PycharmProjects\MindNotez\venv\lib\site packages\pandas\core\internals.py”,第4115行 loc=self.items.get_loc(item) 文件“C:\Users\Lenovo\PycharmProjects\MindNotez\venv\lib\site packages\pandas\core\indexes\base.py”,第3080行,位于get_loc中 返回self._engine.get_loc(self._maybe_cast_indexer(key))。 文件“pandas libs\index.pyx”,第140行,在pandas.libs.index.indexengine.get_loc中 文件“pandas libs\index.pyx”,第162行,位于pandas.libs.index.indexengine.get_loc pandas.libs.hashtable.pyobjecthashtable.get_item中的文件“pandas libs\hashtable_class_helper.pxi”,第1492行。 在pandas.libs.hashtable.pyobjecthashtable.get_item中,第1500行的文件“pandas libs\hashtable_class_helper.pxi” 键错误:(1,1)

    当我打印 print(test_select.head()) ,我得到以下输出:

         Category           Shop
    0       Jidlo         Albert
    1       Jidlo          BILLA
    2       Jidlo         Albert
    3       Jidlo         Albert
    4  Restaurant  Kockafé Freyd
    

    像切片数据帧一样 print(test_select[1:4]) ,打印行1:3。 用命令 打印(测试选择[1,1]) ,我要第二列,第二行。但是,我收到上面的错误消息。

    为什么我要收到 键值错误 例外? 我错过了什么?

    我使用:

    • Python 3.7
    • 幻影
    • 蟒蛇(已安装)
    3 回复  |  直到 7 年前
        1
  •  3
  •   ayorgo    7 年前

    当您想切片数据帧时

    按行编号

    df.iloc[[1, 5]] # to get rows 1 and 5
    
    df.iloc[1:6] # to get rows 1 to 5 inclusive
    

    您还可以将其缩小到以下特定列(以避免 chain indexing )

    df.iloc[[1, 5], df.columns.get_loc('Shop')]
    

    或多列

    df.iloc[[1, 5], df.columns.get_indexer(['Shop', 'Category'])]
    

    按基于标签的索引

    # Numeric
    df.loc[[1, 5]] # 1 and 5 are considered labels here
    df.loc[[1, 5], 'Shop']
    df.loc[[1, 5], ['Shop', 'Category']]
    
    # Textual or otherwise
    df.set_index('Shop', inplace=True)
    df.loc[['BILLA', 'Albert'], 'Category']
    
        2
  •  3
  •   jpp    7 年前

    代码 print(test_select[1,1]) 应显示 第二列。

    不,不应该。 语法 df[x] 通常保留用于检索列(系列)、布尔行索引或行切片。这些用途 pd.DataFrame.__getitem__ 为此 df[] 是句法上的糖分,不方便记录。一般来说,他们应该被视为捷径,如果你不确定你 应该 更喜欢 loc / iloc / at / iat ,视情况而定。

    要通过整数位置索引检索标量值,可以使用 pd.DataFrame.iat :

    df.iat[1, 1]
    
        3
  •  2
  •   BENY    7 年前

    使用 loc 这是使用索引和列而不是位置,这里看起来您的索引是从0到N的,因此 洛克 等于 iloc 当对行进行切片时

    df.loc[1,'Shop']
    'BILLA'