Самоопределяемая функция работает на всем фрейме данных, но не на сгруппированном фрейме данных (применяется с помощью функции 'groupby') в Python - PullRequest
0 голосов
/ 05 июля 2019

У меня есть простой фрейм данных, к которому я хочу применить функцию groupby к столбцу «A» и создать новый столбец, рассчитанный по определенной функции (цикл внутри функции), который получает значения из столбца «B» и столбца «C» , Моя проблема в том, что я смог использовать функцию для всего фрейма данных, но не для сгруппированного фрейма данных (Exception: Column(s) B already selected). Я не знаю, почему он выдает ошибку в сгруппированном фрейме данных, но не во всем фрейме данных. Моя реализация, как показано ниже:

>>> import pandas as pd
>>>
>>> df = pd.read_csv("foo.txt", sep="\t")
>>> df
   A  B   C
0  1  4   3
1  1  5   4
2  1  2  10
3  2  7   2
4  2  4   4
5  2  6   6
>>>
>>> def calc(data):
...         length = len(data['B'])
...         mx = data['B'][0]
...         nx = data['C'][0]
...         for i in range(1,length):
...                 my = data['B'][i]
...                 ny = data['C'][i]
...                 nx = nx + ny
...                 mx=(mx*nx+my*ny)/(nx+ny)
...         return(mx)
...
>>> df_grouped = df.groupby(['A'])
>>> calc(df)
4.217694879423274
>>> calc(df_grouped)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in calc
  File "/mnt/projects/kokep/kokep/devel/miniconda3/lib/python3.6/site-packages/pandas/core/base.py", line 250, in __getitem__
    .format(selection=self._selection))
Exception: Column(s) B already selected
>>>

Как мне заставить это работать? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Я разобрался в проблеме.Я думаю, что reset_index функция должна применяться для каждой из групп:

>>> import pandas as pd
>>>
>>> df = pd.read_csv("foo.txt", sep="\t")
>>> df
   A  B   C
0  1  4   3
1  1  5   4
2  1  2  10
3  2  7   2
4  2  4   4
5  2  6   6
>>>
>>> def calc(data):
...         length = len(data['B'])
...         mx = data['B'][0]
...         nx = data['C'][0]
...         for i in range(1,length):
...                 my = data['B'][i]
...                 ny = data['C'][i]
...                 nx = nx + ny
...                 mx=(mx*nx+my*ny)/(nx+ny)
...         return(mx)
...
>>> result = []
>>> for name, group in df.groupby('A'):
...         group = pd.DataFrame(group).reset_index()
...         out = calc(group)
...         result.append(out)
...
>>> result
[3.488215488215488, 5.866666666666666]
0 голосов
/ 05 июля 2019

Я думаю, что ваш groupby производит pandas.series, и ваша функция не применяется в этой серии. Я пытался играть разными групповыми методами, по какой-то причине это не работает. Как только я найду решение, я опубликую его здесь.

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