python pandas выдает ошибку ключа для столбца, по которому я группируюсь, даже если логическое выражение показывает, что столбец является частью фрейма данных

#python #pandas #dataframe #pandas-groupby #keyerror

Вопрос:

Кажется, я не могу напечатать следующую строку: summarydata["Name"].groupby(["Tag"]).size()

без получения ошибки:

   File "C:Usersrspateluntitled0.py", line 76, in <module>
    print(summarydata["Name"].groupby(["Tag"]).size())

  File "C:UsersrspatelAnaconda3libsite-packagespandascoreseries.py", line 1720, in groupby
    return SeriesGroupBy(

  File "C:UsersrspatelAnaconda3libsite-packagespandascoregroupbygroupby.py", line 560, in __init__
    grouper, exclusions, obj = get_grouper(

  File "C:UsersrspatelAnaconda3libsite-packagespandascoregroupbygrouper.py", line 811, in get_grouper
    raise KeyError(gpr)

KeyError: 'Tag'
 

Я проверил, что тег включен в качестве столбца в фрейм данных summarydata следующим образом:

 if 'Tag' in summarydata.columns:
    print("true")
else :
    print("false")
 

что печатается как истина. Поэтому я не уверен, почему возникает ключевая ошибка, когда столбец находится во фрейме данных.

Ответ №1:

Вы пытаетесь сгруппироваться по ключу в самом столбце. Вместо этого вы хотите:

 summarydata["name"].groupby(summarydata["Tag"])
 

из документов:

по: (отображение, функция, метка или список меток)

Используется для определения групп для groupby. Если by-это функция, она вызывается для каждого значения индекса объекта. Если передается диктант или Ряд, ЗНАЧЕНИЯ Ряда или диктанта будут использоваться для определения групп (значения ряда сначала выравниваются; см. Метод. align ()). Если передается ndarray, значения используются как есть для определения групп. Метка или список меток могут быть переданы в группу по столбцам в self. Обратите внимание, что кортеж интерпретируется как (единственный) ключ.

Другими словами, вы можете передать ему все, что угодно 😉 (Вот почему я не люблю панд…)

Вы можете передать его:

  • a fn, который вызывается при каждом значении
  • диктант(!) или серия, которые будут использоваться для группировки (того, что вы хотите)
  • массив цифр (то же самое)
  • метка или список меток, в этом случае они группируются по столбцу рассматриваемого объекта

Но в вашем случае вы уже выбрали name столбец, поэтому Tag столбец больше не существует! (Подумайте о том, что summarydata["name"] возвращается.)

Поэтому, если вы хотите сгруппироваться подобным образом, вам нужно сначала сгруппироваться:

 summarydata.groupby("Tag")["name"]