Я относительно новичок в данных фреймах Pandas, и мне нужно сделать простой расчет, но пока я не нашел хорошего способа сделать это.
В основном то, что у меня есть:
type group amount
1 A real 55
2 A fake 12
3 B real 610
4 B fake 23
5 B real 45
Теперь я должен добавить новый столбец, который будет отображать процент подделок в общем количестве типов. Таким образом, простая формула для этой таблицы будет для A 12 / (55 + 12) * 100
и для B 23 / (610 + 23 + 45) * 100
, и таблица должна выглядеть примерно так:
type group amount percentage
1 A real 55
2 A fake 12 17.91
3 B real 610
4 B fake 23
5 B real 45 3.39
Я знаю о выражениях groupby
и в основном обо всех компонентах, которые мне нужны для этого (я думаю ...), но не могу понять, как объединить, чтобы получить этот результат.
3 ответа
Попробуйте это:
percentage = {}
for type in df.type.unique():
numerator = df[(df.type == type) & (df.group == 'fake')].amount.sum()
denominator = df[(df.type == type)].amount.sum()
percentage[type] = numerator / denominator * 100
df['percentage'] = list(df.type.map(percentage))
df['percentage'] = df.amount \
/ df.groupby(['type']) \
.amount.transform('sum').loc[df.group.eq('fake')]).fillna('')
df
Если обрабатывается несколько fake
в group
на type
. Мы можем быть немного осторожнее. Я установлю индекс для сохранения столбцов type
и group
во время преобразования.
c = ['type', 'group']
d1 = df.set_index(c, append=True)
d1.amount /= d1.groupby(level=['type']).amount.transform('sum')
d1.reset_index(c)
Отсюда вы можете оставить это в покое или объединить столбец group
.
d1.groupby(level=c).sum().reset_index()
Если вы хотите убедиться, что вы учли несколько поддельных групп для каждого типа, вы можете сделать следующее
type_group_total = df.groupby(['type', 'group']).transform('sum')
type_total = df.groupby('type')[['amount']].transform('sum')
df['percentage'] = type_group_total / type_total
Выход
type group amount percentage
0 A real 55 0.820896
1 A fake 12 0.179104
2 B real 610 0.899705
3 B fake 23 0.100295
4 B fake 45 0.100295
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.