如何在多索引框架中同时操作element和groupwise?

2024-06-02 11:59:56 发布

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

我有以下数据帧:

    df=pd.DataFrame(np.random.randint(1,3,27).reshape((9,3)),\
           index= [['KH','KH','KH','KH','KH','KH','KH','KH','KH'],\
                 ['AOK','AOK','AOK','DOK','DOK','DOK','ROK','ROK','ROK'],\
                 ['A','B','C','A','B','C','A','B','C']],\
           columns=['JE','TE','DE']\
           )
     df.index.names = ['Deck','Status','Urs']
     df
Out[116]: 
                 JE  TE  DE
Deck Status Urs            
KH   AOK    A     1   1   2
            B     1   2   2
            C     2   1   1
     DOK    A     2   2   1
            B     1   2   1
            C     1   2   2
     ROK    A     2   2   2
            B     1   1   2
            C     1   2   1

现在我只想在它后面附加一列'JErel'。此列应包含来自'JE'的值,但作为相对分数。分数应该与'Status'索引组的总和有关

我可以通过以下方式获取金额:

df.loc[('KH','AOK')]['JE'].sum()
Out[117]: 4

列的结果应类似于:

1/df.loc[('KH','AOK')]['JE'].sum(),
1/df.loc[('KH','AOK')]['JE'].sum(),
2/df.loc[('KH','AOK')]['JE'].sum() and then, 
2/df.loc[('KH','DOK')]['JE'].sum(), ... 

,,,, 我就这么走了

如何像apply(Lambda...)那样动态添加列


Tags: dfindexstatusdeoutlocsumdeck
1条回答
网友
1楼 · 发布于 2024-06-02 11:59:56

您可以使用groupby.transform计算与原始数据帧具有相同长度和索引的列JE和,然后将JE列除以它:

df['JErel'] = df.JE.div(df.groupby(level=['Deck','Status']).JE.transform('sum'))
df
#                  JE  TE  DE     JErel
# Deck  Status  Urs             
#   KH     AOK  A   2   2   1   0.400000
#               B   2   2   1   0.400000
#               C   1   1   2   0.200000
#          DOK  A   1   1   2   0.250000
#               B   2   1   2   0.500000
#               C   1   1   1   0.250000
#          ROK  A   2   1   2   0.333333
#               B   2   1   2   0.333333
#               C   2   1   1   0.333333

相关问题 更多 >