Данные:
year month is_p segment x y
2018 JAN Y de 200 500
2018 JAN N de 100 200
2018 JAN N de 500 500
2018 JAN Y de 1000 500
Ожидаемый результат:
year month segment is_p x y %of allocation_x %of allocation_y
2018 JAN de N 600 700 0.333333 0.411765
Y 1200 1000 0.666667 0.588235
Что я пробовал: Я сделал группировку и взял сумму значений для всех Y. После получения суммы я разделил вклад y на общую сумму.
df_p=df.groupby([year,month,is_p,segment]).sum()
# To get the total sum for Y & N for is_p column
df_total=df.groupby([year,month,segment]).sum()
# To get the total sum per segment.
Теперь я хочу получить процент значений (столбец - x,y) по отношению к столбцу is_p.
Если есть другой способ, пожалуйста, помогите с ним.






Вот мое решение!
Сначала выполните groupby на ['year','month','segment'], затем в каждой группе получите сумму x и y относительно is_p. С суммами, затем получите проценты для каждой подкатегории.
d=''' year month is_p segment x y
2018 JAN Y de 200 500
2018 JAN N de 100 200
2018 JAN N de 500 500
2018 JAN Y de 1000 500
2019 JAN Y de 200 500
2019 JAN N de 100 2000
2019 JAN N de 5000 500
2019 JAN Y de 1000 500'''
df = pd.read_csv(pd.compat.StringIO(d), sep='\s+')
def f(x):
grouped = x.groupby('is_p').agg(sum)
for c in grouped.columns:
grouped['%of allocation'+str(c)] = grouped[c]/grouped[c].sum()
return grouped
interested_cols =['x','y']
df.groupby(['year','month','segment'])[['is_p']+interested_cols].apply(f)
Вывод:
x y %of allocation_x %of allocation_y
year month segment is_p
2018 JAN de N 600 700 0.333333 0.411765
Y 1200 1000 0.666667 0.588235
2019 JAN de N 5100 2500 0.809524 0.714286
Y 1200 1000 0.190476 0.285714
Спасибо, получилось и помогает. Однако предположим, что существуют различные меры, такие как x, y, z, r, p, q, s, t. Как я могу настроить петлю на то же самое.
Да, этот ответ помогает. Спасибо.
Пожалуйста, просмотрите ссылку выше, чтобы узнать, относится ли она к той же проблеме. любая помощь будет оценена.
Добро пожаловать в SO! Пожалуйста, отформатируйте ваши данные / код правильно (проверьте раздел помощи на сайте). У меня такое чувство, что мы могли бы легко помочь, если бы лучше понимали ваш вопрос!