Python Pandas Groupby добавляет деление на столбцы, чтобы получить среднее значение - PullRequest
0 голосов
/ 29 августа 2018

У меня большой набор данных (15 000+ строк), и я пытаюсь показать пропорциональную долю инвестиций, основанную на количестве инвесторов (не фактическое владение). Это известный глюк, но мы пытаемся решить для представления. В настоящее время я могу удалить дубликаты в SQL (если у меня 3 клиента с инвестициями в 600, я бы затем удалил дубликаты, чтобы иметь 1 клиента с 600, но это все или ничего, и вместо этого я хотел бы показать этих трех клиентов по 200 каждый) .

Мне нужна функция groupby, чтобы учесть Customerid, parentid и объем инвестиций. Затем мне нужно создать еще один столбец и дать среднюю сумму инвестиций для каждого клиента (инвестиции / число клиентов для этой конкретной суммы в долларах для этой комбинации идентификатора клиента / родительского идентификатора) для каждого имени спонсора / строки. И, наконец, мне нужно сгруппировать, суммировать инвестиции по SponsorName и выполнить подсчет идентификатора клиента.

Dataset:

CustomerID   ParentID    SponsorName    Investment
1            55          Bob            600
1            55          Jack           600
1            55          Mary           600
5            65          Bill           1200
5            65          Jim            1200
5            65          Jill           1200
1            55          Bob            1000
1            55          Jack           1000
1            55          Mary           1000

Выход:

CustomerID   ParentID    SponsorName    Investment   Avg Investment
1            55          Bob            600          200
1            55          Jack           600          200
1            55          Mary           600          200
5            65          Bill           1200         400
5            65          Jim            1200         400
5            65          Jill           1200         400
1            55          Bob            1000         333.33
1            55          Jack           1000         333.33
1            55          Mary           1000         333.33 

Спасибо!

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете использовать GroupBy + transform с size:

counts = df.groupby(['CustomerID', 'ParentID'])['SponsorName'].transform('size')
df['Avg Investment'] = df['Investment'] / counts

Выход:

   CustomerID  ParentID SponsorName  Investment  Avg Investment
0           1        55         Bob         600           200.0
1           1        55        Jack         600           200.0
2           1        55        Mary         600           200.0
3           5        65        Bill        1200           400.0
4           5        65         Jim        1200           400.0
5           5        65        Jill        1200           400.0

Обновлено для вашего исправленного вопроса, любезно @ ScottBoston

group_keys = ['CustomerID', 'ParentID', 'Investment']
counts = df.groupby(group_keys)['SponsorName'].transform('size')
df['Avg Investment'] = df['Investment'] / counts

Выход:

   CustomerID  ParentID SponsorName  Investment  Avg Investment
0           1        55         Bob         600      200.000000
1           1        55        Jack         600      200.000000
2           1        55        Mary         600      200.000000
3           5        65        Bill        1200      400.000000
4           5        65         Jim        1200      400.000000
5           5        65        Jill        1200      400.000000
6           1        55         Bob        1000      333.333333
7           1        55        Jack        1000      333.333333
8           1        55        Mary        1000      333.333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...