Как группировать по списку столбцов - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь передать список столбцов в групповую операцию. Я видел несколько решений, но более сложных, чем мои. Каков самый простой способ решить эту проблему?

cols = [col1, col2, col3]

df[[cols, 'colx']].groupby([cols], as_index=False).sum()

Где 'colx' - это столбец, над которым работает сумма, но не является частью операции groupby.

TypeError: нехешируемый тип: 'list'

Код работает, когда вместо списка напрямую передаются столбцы:

df[['col1', 'col2', 'col3', 'colx']].groupby(['col1', 'col2', 'col3'], as_index=False).sum()

1 Ответ

0 голосов
/ 07 мая 2020

Честно говоря, я не знаю точно, что здесь происходит, но у меня есть несколько теорий. Позвольте мне показать вам мой мыслительный процесс здесь:

df[["col_1", "col_2", "col_3"]]

Это фрагмент df, содержащий список столбцов.

Когда вы передаете список в этот синтаксис, используя, как в первом примере,

col_list = ["col_1", "col_2", "col_3"]
df[[col_list]]

то, что вы на самом деле говорите:

df[[["col_1", "col_2", "col_3"]]]

Pandas не Не знаю, как обрабатывать дополнительный список, поэтому возникает ошибка.

Итак, как я могу передать список в фрейм данных?

df[col_list]

Это работает, могу я просто передать список и добавить его на место? Примерно так:

df[col_list.append("col_x")]

Нету! Это приводит к ошибке KeyError:

>>> df[col_list.append("col_x")]
>>> Traceback (most recent call last):
>>>   File "C:\Users\dmarienburg\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 2646, in get_loc
>>>     return self._engine.get_loc(key)
>>>   File "pandas\_libs\index.pyx", line 111, in pandas._libs.index.IndexEngine.get_loc
>>>   File "pandas\_libs\index.pyx", line 138, in pandas._libs.index.IndexEngine.get_loc
>>>   File "pandas\_libs\hashtable_class_helper.pxi", line 1619, in pandas._libs.hashtable.PyObjectHashTable.get_item
>>>   File "pandas\_libs\hashtable_class_helper.pxi", line 1627, in pandas._libs.hashtable.PyObjectHashTable.get_item
>>>   KeyError: None

Таким образом, самое простое решение - просто добавить список перед разрезанием фрейма данных:

col_list = ["col_1", "col_2", "col_3"]
# some other code here
col_list.append("col_x")
df[col_list]
...