Python: деление столбца в одном фрейме данных на другой с накопленной суммой - PullRequest
0 голосов
/ 14 мая 2018

У меня есть 2 кадра данных, как показано ниже.Мне нужны результирующие данные, в которых накопленные суммы периодов фрейма данных 1 делятся на суммарную сумму периодов фрейма данных 2 в python, проиндексированных на выводе, сайте и отделе.

Кадр данных 1:

 Pin    Site    Department   Period1     Period2     Period3     Period4

 1001     L       42           1           0           2           3
 1003     L       42           4           4           3           4
 1002     R       45           4           5           2           4                    

Фрейм данных 2:

Pin     Site    Department  Period1          Period2    Period3    Period4 

1002      R           45          5            6           5           5 
1003      L           42          4            5           6           8 
1001      L           42          1            2           4           5                    

Выход

 Pin    Site    Department  Period1      Period2       Period3         Period4
 1001     L        42          1/1     (1+0)/(1+2)  (1+0+2)/(1+2+4) (1+0+2+3)/(1+2+4+5)
 1002     R        45          4/5     (4+5)/(5+6)  (4+5+2)/(5+6+5) (4+5+2+4)/(5+6+5+5)
 1003     L        42          4/4     (4+4)/(4+5)  (4+4+3)/(4+5+6) (4+4+3+4)/(4+5+6+8)

Независимо от порядка выводов в обоих фреймах данных мне нужен результирующий фрейм данных, как указано выше.Количество периодов будет увеличиваться месяц за месяцем.

1 Ответ

0 голосов
/ 14 мая 2018

Я думаю, что нужно set_index для выравнивания индексов при делении на div с cumsum, последнее добавление reset_index для столбцов из MultiIndex:

df11 = df1.set_index(['Pin','Site','Department']).cumsum(axis=1)
df22 = df2.set_index(['Pin','Site','Department']).cumsum(axis=1)

df = df11.div(df22).reset_index()
print (df)
    Pin Site  Department  Period1   Period2   Period3   Period4
0  1001    L          42      1.0  0.333333  0.428571  0.500000
1  1002    R          45      0.8  0.818182  0.687500  0.714286
2  1003    L          42      1.0  0.888889  0.733333  0.652174

РЕДАКТИРОВАТЬ:

Для значений отфильтровывания >1 необходимо инвертировать условие - сохранить значения <=1 - сравнить и проверить, если all True с на строки:

df = df11.div(df22)
df = df[(df <= 1).all(axis=1)].reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...