2015-02-12 5 views
1

У меня есть рамка данных pandas с индексом даты и 3 столбцами для нескольких лет данных.Как разделить ежедневную сумму одного столбца на суточную сумму другого столбца в кадре данных Pandon Pandas?

Как я могу рассчитать суточную сумму столбца «C» и делить его на ежедневную сумму столбца «A» и записать его в новый столбец (D)?

Index    A B C 
2014-01-01 00:15:00 10 9 90  
2014-01-01 00:30:00 11 8 88 
2014-01-01 00:45:00 12 7 84 
2014-01-01 01:00:00 13 6 78 
2014-01-01 01:15:00 14 5 70 
2014-01-01 01:30:00 15 4 60 
2014-01-01 01:45:00 16 3 48 
2014-01-01 02:00:00 17 2 34 
2014-01-01 02:15:00 18 1 18 
2014-01-01 02:30:00 19 0 0 
2014-01-01 02:45:00 20 1 20 
2014-01-01 03:00:00 21 2 42 
... 

Большое спасибо за помощь.

ответ

2

Единственный способ, которым я мог подумать, - это сгруппировать, а затем снова слить. Я изменил некоторые из дней в вашем примере, чтобы были разные дни для группировки.

import pandas as pd 

Dict = {'Dates':['2014-01-01 00:15:00','2014-01-01 00:30:00', 
     '2014-01-01 00:45:00','2014-01-02 01:00:00', 
     '2014-01-02 01:15:00','2014-01-03 01:30:00', 
     '2014-01-03 01:45:00','2014-01-03 02:00:00', 
     '2014-01-03 02:15:00','2014-01-03 02:30:00', 
     '2014-01-04 02:45:00','2014-01-04 03:00:00'], 
     'A':[10,11,12,13,14,15,16,17,18,19,20,21], 
     'B':[9,8,7,6,5,4,3,2,1,0,1,2], 
     'C':[90,88,84,78,70,60,48,34,18,0,20,42]} 

df = pd.DataFrame(Dict) 
df['Dates'] = pd.to_datetime(df['Dates']) 
df.set_index('Dates',inplace=True) 

DailySums = df.groupby(df.index.date).sum() 
DailySums['D'] = DailySums.C/DailySums.A 
DailySums.index = pd.to_datetime(DailySums.index) 

df1 = pd.merge(df, DailySums[['D']], left_on=df.index.date, 
    right_on=DailySums.index.date,how='left').set_index('key_0') 

Даст вам:

   A B C   D 
key_0       
2014-01-01 10 9 90 7.939394 
2014-01-01 11 8 88 7.939394 
2014-01-01 12 7 84 7.939394 
2014-01-02 13 6 78 5.481481 
2014-01-02 14 5 70 5.481481 
2014-01-03 15 4 60 1.882353 
2014-01-03 16 3 48 1.882353 
2014-01-03 17 2 34 1.882353 
2014-01-03 18 1 18 1.882353 
2014-01-03 19 0 0 1.882353 
2014-01-04 20 1 20 1.512195 
2014-01-04 21 2 42 1.512195 
+0

Я думаю, что с помощью метода 'transform' на объекте GroupBy даст вам немного более чистого синтаксиса. Съемка с бедра: возможно, что-то вроде 'df ['D'] = df.groupby (...). Transform (lambda g: g ['A']. Sum()/g ['C']. Sum())) ' –

+0

Большое спасибо за ваши ответы. –

+0

@ Liam Foley: в строке «DailySums = df.groupby (df.index.date) .sum()« Я получаю сообщение об ошибке «AttributeError:» Объект DatetimeIndex не имеет атрибута «date» –

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