группировка и транспонирование питона - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть датафрейм - df, как показано ниже:

 df = pd.DataFrame({"Customer_no": ['1', '1', '1', '2', '2', '6', '7','8','9','10'],
      "Card_no": ['111', '222', '333', '444', '555', '666', '777','888','999','000'],
      "Card_name":['AAA','AAA','BBB','CCC','AAA','DDD','EEE','BBB','CCC','CCC'],
      "Group_code":['123','123','456','678','123','434','678','365','678','987'],
      "Amount":['100','240','450','212','432','123','543','567','232','453'],
      "Category" :['Electrical','Electrical','Hardware','House','Electrical','Car','House','Toy','House','Bike123']})

Теперь мне нужно сгруппировать по номеру клиента и получить общую сумму, лучшие 1,2,3 категории и их процент от общей суммы.ПРИМЕЧАНИЕ: в моем наборе данных Toy у меня есть только 2 категории, в моих исходных данных у меня есть больше, мне нужно выбрать 5 лучших категорий.Мой Dataframe должен выглядеть следующим образом:

 df = pd.DataFrame({"Customer_no": ['1', '1', '1', '2', '2', '6', '7','8','9','10'],
      "Card_no": ['111', '222', '333', '444', '555', '666', '777','888','999','000'],
      "Card_name":['AAA','AAA','BBB','CCC','AAA','DDD','EEE','BBB','CCC','CCC'],
      "Group_code":['123','123','456','678','123','434','678','365','678','987'],
      "Amount":['100','240','450','212','432','123','543','567','232','453'],
      "Category" :['Electrical','Electrical','Hardware','House','Electrical','Car','House','Toy','House','Bike123'],
      "Total amount" :['790','790','790','644','644','123','543','567','232','453'],
      "Top-1 Category":['Hardware','Hardware','Hardware','Electrical','Electrical','Car','House','Toy',
                        'House','Bike123'],
      "Top-1 Category %":['57','57','57','67','67','100','100','100','100','100'],
      "Top-2 Category":['Electrical','Electrical','Electrical','House','House','','','','',''] ,    
      "Top-2 Category %":['43','43','43','33','33','0','0','0','0','0']})

Запросить вашу помощь для достижения этого.

ПРИМЕЧАНИЕ: 1) Высшая категория выбирается путем группировки всех категорий по каждому клиенту и суммирования суммыдля каждой категории клиентов.К какой категории больше всего относится ее категория «Топ-1», аналогичным образом, следующая категория - «Топ-2» и т. Д. 2) Процент категории «Топ-1». Это общая сумма каждой категории, разделенная на общую сумму и умноженная на 100. Это для каждого клиента.Аналогично для категории Top 2.

1 Ответ

0 голосов
/ 28 ноября 2018

Попробуйте это:

#Your data
df = pd.DataFrame({"Customer_no": ['1', '1', '1', '2', '2', '6', '7','8','9','10'],
      "Card_no": ['111', '222', '333', '444', '555', '666', '777','888','999','000'],
      "Card_name":['AAA','AAA','BBB','CCC','AAA','DDD','EEE','BBB','CCC','CCC'],
      "Group_code":['123','123','456','678','123','434','678','365','678','987'],
      "Amount":['100','240','450','212','432','123','543','567','232','453'],
      "Category" :['Electrical','Electrical','Hardware','House','Electrical','Car','House','Toy','House','Bike123']})
#Make some columns numerical
for i in ["Customer_no","Card_no","Group_code","Amount"]:
    df[i] = pd.to_numeric(df[i])

#Total sum
Total_amount = pd.DataFrame(df.groupby(["Customer_no"]).Amount.sum()).reset_index().rename(columns={'Amount':'Total amount'})

#Add some nesessery colums and grouping
Top_1_Category = pd.DataFrame(df.groupby(['Customer_no',"Category"]).Amount.sum()).reset_index().rename(columns={'Amount':'group_sum'})

df = df.merge(Total_amount,how='left',on='Customer_no')
df = df.merge(Top_1_Category,how='left',on=['Category','Customer_no'])

group_top_1 = df[['Customer_no','Category','group_sum']].loc[df.groupby('Customer_no').group_sum.agg('idxmax')].rename(columns={'Category':'Top-1 Category','group_sum':'group_sum_1'})

df = df.merge(group_top_1,how='left',on='Customer_no')

#Make columns 'Top-1 Category %'
df['Top-1 Category %'] = round(100*df['group_sum_1']/df['Total amount'],0)
#drop unnecessary columns
df.drop(['group_sum','group_sum_1'],axis=1,inplace=True)

Вы можете добавить Top-2 столбец simular

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...