#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. да, коэффициент должен быть рассчитан для каждой компании за каждый год