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

标签 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

如何添加占总数的百分比 例如,ErrorCode 0 为 80/111、31/111 等

我试过了

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

最佳答案

我认为您需要按第一级进行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 的结果是一个 Series,因此 apply 函数将逐个元素进行操作。 (不像 pandas DataFrame 那样在整个列上)。

关于python - 将函数应用于 pandas 中的分组数据计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42834664/

相关文章:

python - 确定时间序列中的值未更改的位置

python - 如果几个字符串之一在其他字符串中 : return a value + matching string, Python

python - 不同数据框的模糊匹配列

javascript - 我在 Flask 应用程序中使用 $.(get) 请求时遇到的 JavaScript 问题

python - 将多列和多行组合为字典中的单个值

python - for循环中的递增计数器

python - 在Python的正则表达式中提取两个标记之间的文本并处理反斜杠

python - 使用 FFT 来近似聚合损失随机变量的 CDF

python - 如何在任何给定时间点从给定字符串中找到前 10 个单词。 Python

python - 尝试每小时向 channel 发送消息