Python Pandas получает сгруппированную скорость передачи данных

#python #pandas

#python #панды

Вопрос:

У меня такая проблема, у меня есть сгруппированные данные за год:

 com_name     year   type  value
company1     2000   A      100
company1     2000   B      600
company1     2001   A      900
company2     2005   B      300
company2     2000   A      687
company2     2000   B      989
company3     2015   A      351
company3     2015   B      654
company3     2016   B      9345
  

И для каждой компании за каждый год мне нужно иметь соотношение A / B.

 com_name  year   type  value    type ratio
company1  2000   A      100        1/7
company1  2000   B      600        6/7
company1  2001   A      900         1
company2  2005   B      300         1 
company2  2000   A      600        6/15
company2  2000   B      900        9/15
company3  2015   A      300        3/9
company3  2015   B      600        6/9
company3  2016   B      9345        1
  

итак, столбец соотношения типов = тип значения A / (тип значения B тип значения A) для каждой компании за каждый год.

тип type_ratio должен быть float, а не common fraction . Я использую его только для примера

Ответ №1:

Используйте GroupBy.transform с sum для нового Series заполнения по совокупным значениям и деления по исходному столбцу:

 #if necessary convert to column comp
df = df.rename_axis('comp').reset_index()
print (df)
       comp  year type  value
0  company1  2000    A    100
1  company1  2000    B    600
2  company1  2001    A    900
3  company2  2005    B    300
4  company2  2010    A    687
5  company2  2010    B    989
6  company3  2015    A    351
7  company3  2015    B    654
8  company3  2016    B   9345

df['ratio'] = df['value'].div(df.groupby(['comp','year'])['value'].transform('sum'))
print (df)
       comp  year type  value     ratio
0  company1  2000    A    100  0.142857
1  company1  2000    B    600  0.857143
2  company1  2001    A    900  1.000000
3  company2  2005    B    300  1.000000
4  company2  2010    A    687  0.409905
5  company2  2010    B    989  0.590095
6  company3  2015    A    351  0.349254
7  company3  2015    B    654  0.650746
8  company3  2016    B   9345  1.000000
  

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

1. ваш ответ очень важен, но как решить эту проблему, если компании не являются индексом?

2. @Xum3abodMedia — Не уверен, что понимаю, company значения здесь важны?

3. да, коэффициент должен быть рассчитан для каждой компании за каждый год