2017-02-02 2 views
2

Связанный с 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] 
       }) 

ответ

3

только посмотреть в том же месяце, так вы можете группировать столбец month, а затем в каждой группе используйте option == "B" для подмножества колонки и возьмите сумма, использовать суммированный значение разделить единицы столбец (перевод вашей логики):

df['unit_count'] = df.groupby('month', group_keys=False).apply(
         lambda g: g.unit/g['count'][g.option == "B"].sum()) 
df 

enter image description here

+1

хорошее решение! Я думаю, что использование '.loc []' могло бы сделать его еще более приятным: 'df.groupby (['year', 'month']). Apply (lambda g: g.unit/g.loc [g.option == 'B', 'count']. Sum()) ' – MaxU

+0

@MaxU У меня было такое же чувство, но я понятия не имею, будет ли оно быстрее, но тем более компактным. – Psidom

+0

Решение @Psidom хорошо работает, особенно при добавлении df.groupby (['year', 'month], который рекомендует @MaxU. @ Более компактное решение MaxU возвращает две ошибки. 'ValueError: несоответствие буфера dtype, ожидаемый' объект Python ', но «long» и «TypeError: несовместимый индекс вставленного столбца с индексом кадра» – christofern

Смежные вопросы