Расчет относительного размера внутри группы в фрейме данных pandas

#python #pandas #dataframe

Вопрос:

У меня есть size фрейм данных с ежедневными размерами , и на основе второго group фрейма данных я пытаюсь рассчитать относительный размер внутри групп в каждый день.

 size = pd.DataFrame({  'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'],  '01K W':[10, 15, 20, 18, 13],   '02K W':[14, 24, 'nan', 'nan', 18],   '03K W':[13, 12, 16, 21, 19],   '04K W':[16, 25, 15, 31, 20]})  size = size.replace('nan', np.nan)  group = pd.DataFrame({  'ID':['01K W', '02K W', '03K W', '04K W'],  'Group':['Group1', 'Group1', 'Group2', 'Group1']})   

То, что я пытаюсь сделать, — это фрейм данных, аналогичный result с назначенными относительными весами.

 result = pd.DataFrame({  'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'],  '01K W':[0.25, 0.23, 0.57, 0.37, 0.25],   '02K W':[0.35, 0.38, 0, 0, 0.35],   '03K W':[1, 1, 1, 1, 1],   '04K W':[0.4, 0.39, 0.43, 0.63, 0.39]})  

Существует ли эффективный способ для большого набора данных? Спасибо!

Ответ №1:

Вы должны заменить «nan» на 0, если хотите, чтобы ваша сумма была правильно рассчитана. Затем группируйте по группам и преобразуйте:

 size = pd.DataFrame({  'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'],  '01K W':[10, 15, 20, 18, 13],   '02K W':[14, 24, 'nan', 'nan', 18],   '03K W':[13, 12, 16, 21, 19],   '04K W':[16, 25, 15, 31, 20]})   group = pd.DataFrame({  'ID':['01K W', '02K W', '03K W', '04K W'],  'Group':['Group1', 'Group1', 'Group2', 'Group1']})   size = size.replace('nan', 0).set_index("Date").T size["Groups"] = list(group['Group'])  print(size.groupby("Groups").transform(lambda x: x/x.sum()).T)  

Выход:

 01K W 02K W 03K W 04K W Date  2021-01-01 0.250000 0.350000 1.0 0.400000 2021-01-02 0.234375 0.375000 1.0 0.390625 2021-01-03 0.571429 0.000000 1.0 0.428571 2021-01-04 0.367347 0.000000 1.0 0.632653 2021-01-05 0.254902 0.352941 1.0 0.392157  

Комментарии:

1. отлично, большое спасибо!