为了账号安全,请及时绑定邮箱和手机立即绑定

创建每组百分比的数据框

创建每组百分比的数据框

慕工程0101907 2022-05-19 18:42:41
我有以下数据框,´data = {'ID':[279, 224, 221, 329, 333],    'GROUP':['BLACK', 'BLACK', 'BLUE', 'GREEN','BLACK'],    'ITEM_1':['Delhi', 'Kanpur', 'Delhi', 'Kannauj', 'Delhi'],    'ITEM_2':['Msc', 'Kanpur', 'Kanpur', 'Phd', 'Kanpur']}´´df = pd.DataFrame(data)´´df = df.set_index('ID')´ ID  Group    Item_1   Item_2279    A      Delhi    Msc224    A      Kanpur   Kanpur        221    B      Delhi    Kanpur    329    C      Kannauj  Phd333    A      Delhi    Kanpur如何创建以下数据框,行等于不同的项目和列与组,即            Delhi      KANPUR       Kannauj    Msc      Phd                     A         2/6%       3/6%         0%       1/6%      0%   B         1/2%       1/2%         0%        0%       0%   C           0%         0%       1/2%        0%     1/2%我的意思是,构建一个相对于每组总数的百分比数据框。任何想法将不胜感激。我虽然使用 groupby(['GROUP']) 和 .apply(lambda r: r/r.sum(), axis=1),但这不是我需要这个数据框的方式
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

首先合并这些列单列:


all_items = pd.concat([df.ITEM_1, df.ITEM_2])

all_items

Out[8]: 

ID

279      Delhi

224     Kanpur

221      Delhi

329    Kannauj

333      Delhi

279        Msc

224     Kanpur

221     Kanpur

329        Phd

333     Kanpur

dtype: object

然后,将其合并回 df:


temp_df = pd.concat([df[["GROUP"]].copy(), df[["GROUP"]].copy()])

temp_df["ITEM"] = all_items

temp_df.reset_index(inplace=True)

temp_df["temp_col"] = 1

temp_df

Out[15]: 

    ID  GROUP     ITEM  temp_col

0  279  BLACK    Delhi         1

1  224  BLACK   Kanpur         1

2  221   BLUE    Delhi         1

3  329  GREEN  Kannauj         1

4  333  BLACK    Delhi         1

5  279  BLACK      Msc         1

6  224  BLACK   Kanpur         1

7  221   BLUE   Kanpur         1

8  329  GREEN      Phd         1

9  333  BLACK   Kanpur         1

最后转一下,


my_pivot = temp_df.pivot_table(values="temp_col", index="GROUP", columns="ITEM", aggfunc=np.sum, fill_value=0)

my_pivot = my_pivot / len(df)

# my_pivot / len (df) # <-- changing this to

to_div = my_pivot.aggregate(np.sum, axis=1) # <-- this and

my_pivot = my_pivot.div(to_div, axis=0) # <-- this

Out[31]: 

    ITEM      Delhi  Kannauj  Kanpur       Msc  Phd

GROUP                                          

BLACK  0.333333      0.0     0.5  0.166667  0.0

BLUE   0.500000      0.0     0.5  0.000000  0.0

GREEN  0.000000      0.5     0.0  0.000000  0.5

完毕。


查看完整回答
反对 回复 2022-05-19
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号