Я относительно новичок в данных фреймах 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 и в основном обо всех компонентах, которые мне нужны для этого (я думаю ...), но не могу понять, как объединить, чтобы получить этот результат.

1
wanaryytel 8 Дек 2016 в 01:48

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))
0
AlexG 7 Дек 2016 в 23:07
df['percentage'] = df.amount \
                 / df.groupby(['type']) \
                     .amount.transform('sum').loc[df.group.eq('fake')]).fillna('')
df

enter image description here


Если обрабатывается несколько 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)

enter image description here


Отсюда вы можете оставить это в покое или объединить столбец group.

d1.groupby(level=c).sum().reset_index()

enter image description here

1
piRSquared 8 Дек 2016 в 04:00

Если вы хотите убедиться, что вы учли несколько поддельных групп для каждого типа, вы можете сделать следующее

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
0
Ted Petrou 8 Дек 2016 в 01:23