Разрезание DataFrame в Python завершается неудачно - PullRequest
0 голосов
/ 16 декабря 2018

Я хочу нарезать свои данные в 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_class_helper.pxi", строка 1500, в pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: (1, 1)

Во время обработки вышеупомянутого исключения произошло другое исключение:

Traceback (последний вызов был последним): файл "C: /Users/Lenovo/.PyCharmCE2018.1/config/scratches/Dictionary.py",строка 8, в печати (h_select [1,1]), файл "C: \ Users \ Lenovo \ PycharmProjects \ mindnotez \ venv \ lib \ site-packages \ pandas \ core \ frame.py", строка 2688, в getitem return self._getitem_column (key) Файл "C: \ Users \ Lenovo \ PycharmProjects \ mindnotez \ venv \ lib \ site-packages \ pandas \ core \ frame.py", строка 2695, в _getitem_column возвращает self._get_item_cache(ключ) Файл "C: \ Users \ Lenovo \ PycharmProjects \ mindnotez \ venv \ lib \ site-packages \ pandas \ core \ gener"ic.py ", строка 2489, в _get_item_cache values ​​= self._data.get (item) Файл" C: \ Users \ Lenovo \ PycharmProjects \ mindnotez \ venv \ lib \ site-packages \ pandas \ core \ internals.py ",строка 4115, в get 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_class_helper.pxi", строка 1492, в файле pandas._libs.hashtable.PyObjectHashTable.get_item "pandas_libs \ hashtable_px.lib..PyObjectHashTable.get_item KeyError: (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.С помощью команды print(test_select[1,1]) я хочу второй столбец, второй ряд.Тем не менее, я получаю сообщение об ошибке выше.

Почему я получаю исключение KeyError ? Что мне не хватает?

Я использую:

  • Python3.7
  • PyCharm
  • Анаконда (установлена)

Ответы [ 4 ]

0 голосов
/ 22 мая 2019

Если вам нужен второй столбец второго столбца, вы должны использовать: df.iloc [1,1] iloc извлекает данные на основе индекса

[1,1] берет индекс первой строки и индекс первого столбца.вывод будет "BILLA"

0 голосов
/ 16 декабря 2018

Код print(test_select[1,1]) должен отображать вторую строку второго столбца.

Нет, не должен. Синтаксис df[x] обычнозарезервировано для извлечения столбца (серии), логического индексирования строки или нарезки строки.Такое использование pd.DataFrame.__getitem__, для которого df[] является синтаксическим сахаром, не документировано удобно.В общем, их следует рассматривать как ярлыки, и если вы не уверены, вы должны предпочесть loc / iloc / at / iat, в зависимости от ситуации.

Для полученияскалярное значение с помощью целочисленного позиционного индексирования можно использовать pd.DataFrame.iat:

df.iat[1, 1]
0 голосов
/ 16 декабря 2018

Использование loc это использование индекса и столбца, а не позиции, здесь похоже, что ваш индекс от 0 до n, так что loc равен iloc при срезании строки

df.loc[1,'Shop']
'BILLA'
0 голосов
/ 16 декабря 2018

Если вы хотите нарезать кадр данных

По номеру строки

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

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

Вы также можете сузить его до определенного столбца следующим образом (чтобы избежать цепная индексация )

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