将函数应用于pandas中的分组数据计数

时间:2017-03-16 12:52:39

标签: python pandas

>>> new_confirmIOC.groupby(['ErrorCode','ResponseType']).OrderID.count()
ErrorCode  ResponseType        
0          CANCEL_ORDER_CONFIRM    80
           TRADE_CONFIRM           31
1          CANCEL_ORDER_CONFIRM    80
           TRADE_CONFIRM           31

如何添加总数百分比 例如-80 / 111,31 / 11 for ErrorCode 0等等

我试过

new_confirmIOC.groupby(['ErrorCode','ResponseType']).OrderID.count().apply(lambda x: x / x.sum())

但它给了我

ErrorCode  ResponseType        
0          CANCEL_ORDER_CONFIRM    1
           TRADE_CONFIRM           1
1          CANCEL_ORDER_CONFIRM    1
           TRADE_CONFIRM           1
Name: OrderID, dtype: int64

1 个答案:

答案 0 :(得分:2)

我认为您需要groupby第一级并除以sum

df = new_confirmIOC.groupby(['ErrorCode','ResponseType']).OrderID.count()
df = df.groupby(level='ErrorCode').apply(lambda x: x / x.sum())
print (df)
ErrorCode  ResponseType        
0          CANCEL_ORDER_CONFIRM    0.720721
           TRADE_CONFIRM           0.279279
1          CANCEL_ORDER_CONFIRM    0.720721
           TRADE_CONFIRM           0.279279
Name: val, dtype: float64

transform的另一个解决方案:

df = df.div(df.groupby(level='ErrorCode').transform('sum'))
print (df)
ErrorCode  ResponseType        
0          CANCEL_ORDER_CONFIRM    0.720721
           TRADE_CONFIRM           0.279279
1          CANCEL_ORDER_CONFIRM    0.720721
           TRADE_CONFIRM           0.279279
Name: val, dtype: float64

感谢您FLab发表评论:

.count的结果是一个系列,因此apply函数将逐个元素地运行。 (不是像pandas DataFrame那样在整个列上)。