Связанный с this вопрос о вычислении значения DataFrame из условия, у меня есть более сложный вопрос о включении суммы, основанной на этом условии для данной строки, которую я борется с. Здесь начальная ДФ:Создание столбца DataFrame Pandas с результатами из суммы условия
Key UID VID count month option unit year
0 1 5 100 1 A 10 2015
1 1 5 200 1 B 20 2015
2 1 5 300 2 A 30 2015
3 1 5 400 2 B 40 2015
4 1 7 450 2 B 45 2015
5 1 5 500 3 B 50 2015
Ищу для перебора этого временного ряда DataFrame, добавление столбца «unit_count» для каждой строки, которые делят значение «единицы» на сумму «количество» в в этом месяце, только если опция «B». По существу:
df['unit_count'] = df['unit']/sum of df['count'] for all records containing 'option' 'B' in the same month
Что бы добавить к DataFrame следующим образом:
Key UID VID count month option unit year unit_count
0 1 5 100 1 A 10 2015 0.050
1 1 5 200 1 B 20 2015 0.100
2 1 5 300 2 A 30 2015 0.035
3 1 5 400 2 B 40 2015 0.047
4 1 7 450 2 B 45 2015 0.053
5 1 5 500 3 B 50 2015 0.100
Код для примера ДФ выше:
df = pd.DataFrame({'UID':[1,1,1,1,1,1],
'VID':[5,5,5,5,7,5],
'year':[2015,2015,2015,2015,2015,2015],
'month':[1,1,2,2,2,3],
'option':['A','B','A','B','B','B'],
'unit':[10,20,30,40,45,50],
'count':[100,200,300,400,450,500]
})
хорошее решение! Я думаю, что использование '.loc []' могло бы сделать его еще более приятным: 'df.groupby (['year', 'month']). Apply (lambda g: g.unit/g.loc [g.option == 'B', 'count']. Sum()) ' – MaxU
@MaxU У меня было такое же чувство, но я понятия не имею, будет ли оно быстрее, но тем более компактным. – Psidom
Решение @Psidom хорошо работает, особенно при добавлении df.groupby (['year', 'month], который рекомендует @MaxU. @ Более компактное решение MaxU возвращает две ошибки. 'ValueError: несоответствие буфера dtype, ожидаемый' объект Python ', но «long» и «TypeError: несовместимый индекс вставленного столбца с индексом кадра» – christofern