DataFrame.groupby.agg (список) работает, но не работает ('список') - PullRequest
1 голос
/ 26 мая 2020

Я пытался применить то, что listagg делает в SQL в pandas

Почему следующее работает

DataFrame.groupby.agg(list) 

, а следующее - нет?

DataFrame.groupby.agg('list')

Я преобразовывал данные ниже: Digital tracking data

в enter image description here

Ответы [ 2 ]

1 голос
/ 26 мая 2020
  • Если параметр метода .agg() - это имя функции (т.е. не строка с ее именем), это должно быть известное имя для Python, т.е. стандартная, импортированная или ваша собственная функция.
    (В вашем случае list - это стандартная функция Python.)

  • Если параметром метода .agg() является строка , тогда pandas

    1. использует метод класса GroupBy , если метод с таким именем существует
      (в вашем случае нет метода .list() класса GroupBy),
    2. использует функцию NumPy с таким именем , если функция с таким именем существует (в вашем случае нет функции numpy.list())

Как видите, если параметр является строкой, Pandas игнорирует функции, известные Python.

1 голос
/ 26 мая 2020

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

if isinstance(func, str):
    return getattr(self, func)(*args, **kwargs)

где self - это экземпляр SeriesGroupBy, который является подклассом GroupBy. Класс GroupBy имеет ряд методов, которые можно использовать для агрегирования (включая count, mean, median, и c.). С другой стороны, list - это, конечно, не метод GroupBy, а скорее встроенная функция Python, поэтому ее не удается найти при вызове getattr(). Я предполагаю, что это также относится к DataFrameGroupBy, поскольку он также является подклассом GroupBy.

Аналогичным образом, .agg() не сможет использовать любое определяемое пользователем имя функции, если оно предоставлено в виде строки.

Чтобы просмотреть список всех доступных строк, которые нужно передать в .agg(), ознакомьтесь с этой статьей в pandas документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...