Обработка агрегации в фрейме данных pandas на основе ограничения в столбце

Я анализирую данные в Excel, который содержит несколько столбцов. Я извлек из тех столбцов, которые анализирую. исходя из некоторых условий существующего столбца, я хотел бы создать несколько новых столбцов.

Прежде всего, мой образец фрейма данных выглядит следующим образом:

df = pd.DataFrame()
df['Match'] = ['A','A','A','A','A','B','B','B','B','B',]
df['HomeGoal'] = [ 0,1,2,3,4,0,1,2,3,4]
df['AwayGoal'] = [ 0,1,2,3,4,0,1,2,3,4]
df ['AOS'] = [0.12,0.12,0.12,0.12,0.12,0.06,0.06,0.06,0.06,0.06]
df ['% Prob'] = [0.15,0.12,0.10,0.08,0.05,0.18,0.15,0.10,0.08,0.05]

Фрейм данных содержит Совпадение, ГлавнаяЦель, В гостях, AOS и % Вероятность.

Я хочу создать следующие столбцы

Homegoal <1
HomeGoal <2
HomeGoal <3
HomeGoal >=1
HomeGoal >=2
HomeGoal >=3

Каждый столбец содержит сумму% prob, которая соответствует следующим условиям:

Homegoal <1 ==> sum of the colums % Prob where Homegoal less than 1
HomeGoal <2 ==> sum of the colums % Prob where Homegoal less than 2
HomeGoal <3 ==> sum of the colums % Prob where Homegoal less than 3
HomeGoal >=1 ==> sum of the colums % Prob and AOS where Homegoal 1 goals and above
HomeGoal >=2 ===> sum of the colums % Prob and AOS where Homegoal 2 goals and above
HomeGoal >=3 ==> sum of the colums % Prob and AOS where Homegoal 2 goals and above

Все эти расчеты, упомянутые выше, основаны на каждом матче.

Могу я получить ваш совет, как это сделать?

Я прикрепил ожидаемый результат следующим образом:

Обработка агрегации в фрейме данных pandas на основе ограничения в столбце

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Можно использовать numpy.where
Пример для 1:

import numpy as np
df['HG>=1'] = np.where(df['HomeGoal']>=1, 
    'insert your pass condition logic calculation here', 
    'insert your fail condition logic calculation here')

Я не понимаю ваших логических расчетов «годен / не годен», поэтому вам придется предоставить это или ввести сами.

Ошибок считается нулевым. Но я предоставил условие прохождения, которое является агрегированием.

Zephyr 17.12.2018 07:43

Как вы вычисляли индексную строку 6 столбца HG>=1? У меня 0.05 + 0.08 + 0.10 + 0.15 + 0.06 = 0.44 вместо 0.48, который есть на вашем скриншоте. Если вы сделали это в Excel, почему бы просто не опубликовать формулу Excel?

ycx 17.12.2018 07:51

Извините, это была моя ошибка в расчетах. оно должно быть 0,44. Спасибо.

Zephyr 17.12.2018 07:54
Ответ принят как подходящий

Использовать:

L = [1,2,3]

for v in L:
    #new column name 
    col = 'HG> = {}'.format(v)
    #filter by condition
    df1 =  df[df['HomeGoal'] >= v]
    #new Series filled by aggregated values per groups and added column AOS
    df[col] = df1.groupby('Match')['% Prob'].transform('sum') + df['AOS']
    #only first non missing value per group
    mask = ~df.dropna(subset=[col]).duplicated(subset=[col, 'Match']) 
    df[col] = df[col].mask(~mask, 0)

for v in L:
    col = 'HG>{}'.format(v)
    df[col] = df[df['HomeGoal'] < v].groupby('Match')['% Prob'].transform('sum')
    mask = ~df.dropna(subset=[col]).duplicated(subset=[col, 'Match']) 
    df[col] = df[col].mask(~mask, 0)

print (df)

  Match  HomeGoal  AwayGoal   AOS  % Prob  HG>=1  HG>=2  HG>=3  HG>1  HG>2  \
0     A         0         0  0.12    0.15   0.00   0.00   0.00  0.15  0.27   
1     A         1         1  0.12    0.12   0.47   0.00   0.00  0.00  0.00   
2     A         2         2  0.12    0.10   0.00   0.35   0.00  0.00  0.00   
3     A         3         3  0.12    0.08   0.00   0.00   0.25  0.00  0.00   
4     A         4         4  0.12    0.05   0.00   0.00   0.00  0.00  0.00   
5     B         0         0  0.06    0.18   0.00   0.00   0.00  0.18  0.33   
6     B         1         1  0.06    0.15   0.44   0.00   0.00  0.00  0.00   
7     B         2         2  0.06    0.10   0.00   0.29   0.00  0.00  0.00   
8     B         3         3  0.06    0.08   0.00   0.00   0.19  0.00  0.00   
9     B         4         4  0.06    0.05   0.00   0.00   0.00  0.00  0.00   

   HG>3  
0  0.37  
1  0.00  
2  0.00  
3  0.00  
4  0.00  
5  0.43  
6  0.00  
7  0.00  
8  0.00  
9  0.00  

Спасибо, Джез. Я попробую это с моими данными, так как сейчас меня нет.

Zephyr 17.12.2018 08:09

Хорошее решение!

koPytok 17.12.2018 08:12

@koPytok - Спасибо.

jezrael 17.12.2018 08:13

Другие вопросы по теме