【问题标题】:Create dataframe of percentage of each group创建每组百分比的数据框
【发布时间】:2019-09-05 12:37:29
【问题描述】:

我有以下数据框,

´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_2
279    A      Delhi    Msc
224    A      Kanpur   Kanpur        
221    B      Delhi    Kanpur    
329    C      Kannauj  Phd
333    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),但这不是我需要这个数据框的方式

谢谢!!

【问题讨论】:

    标签: python dataframe


    【解决方案1】:

    先合并这些列单列:

    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
    

    完成。

    【讨论】:

    • 谢谢你的回答,但我有一个疑问,例如绿色组只有2个项目,那么它的值应该是0.5而不是0.2
    • 我的意思是,数据框中的值是每个组的百分比。例如,德里黑是 2/6
    猜你喜欢
    • 2022-12-09
    • 2020-11-10
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多