创建每组百分比的数据帧

2024-09-29 17:10:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧

´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

如何创建以下dataframe,行等于组中的不同项和列,即

            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),但这不是我需要这个数据帧的方式

谢谢


Tags: 数据iddfdatagroupgreenblueitem
1条回答
网友
1楼 · 发布于 2024-09-29 17:10:48

首先将这些列合并到单个列:

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

完成

相关问题 更多 >

    热门问题