基于分组列的条件总和

时间:2017-12-20 14:04:49

标签: python pandas group-by aggregate

基本上,我想创建一个列ERROR RATE,其中YES位于ERROR中,并将其除以NO中的ERROR。 {1}},但要ERROR RATELOCATIONDESCRIPTION进行过滤。

df = pd.DataFrame({'ERROR' : ['YES','YES','NO','NO','YES'],
           'LOCATION' : ['London', 'New York', 'Edinburgh', 'Paris', 'Berlin'],
           'DESCRIPTION' : ['Good', 'Bad', 'Good', 'Bad', 'Bad']}) 

我尝试过编写代码:

df.groupby(['DESCRIPTION','LOCATION'])['ERROR'].agg()

但我不确定是否a)这甚至是正确的方法b)我需要为agg()

编写什么样的函数

提前致谢

1 个答案:

答案 0 :(得分:2)

也许您正在寻找groupby + value_counts + unstack + div

i = df.groupby(['DESCRIPTION' ,'LOCATION']).ERROR.value_counts().unstack(-1)
j = (i.YES / i.NO).to_frame('ERROR_RATE')

j

                       ERROR_RATE
DESCRIPTION LOCATION             
Bad         Berlin            ...
            New York          ...
            Paris             ...
Good        Edinburgh         ...
            London            ...

如果特定组的YESNO没有计数,则结果列将为最终结果中的这些条目设置NaN

如果您正在使用agg,则需要一个三向分组。

i = df.groupby(['DESCRIPTION','LOCATION','ERROR']).ERROR.count().unstack()
j = (i.YES / i.NO).to_frame('ERROR_RATE')

j
                       ERROR_RATE
DESCRIPTION LOCATION             
Bad         Berlin            ...
            New York          ...
            Paris             ...
Good        Edinburgh         ...
            London            ...

countagg('count')相同。