Python 如何将具有平均百分比和平均计数的列添加到数据帧?

Python 如何将具有平均百分比和平均计数的列添加到数据帧?,python,pandas,Python,Pandas,这个问题涉及到。我有以下数据帧: df = QUEUE_1 QUEUE_2 DAY HOUR TOTAL_SERVICE_TIME TOTAL_WAIT_TIME EVAL ABC123 DEF656 1 7 20 30 1 ABC123 1 7 22 32

这个问题涉及到。我有以下数据帧:

df =
    QUEUE_1   QUEUE_2   DAY   HOUR   TOTAL_SERVICE_TIME  TOTAL_WAIT_TIME   EVAL
    ABC123    DEF656    1     7      20                  30                1
    ABC123              1     7      22                  32                0
    DEF656    ABC123    1     8      15                  12                0
    FED456    DEF656    2     8      15                  16                1
我需要得到以下数据帧(它与我在上一个问题中想要得到的数据帧类似,但这里我需要添加两列
AVG\u COUNT\u PER\u DAY\u HOUR
AVG\u PERCENT\u EVAL\u 1

AVG\u COUNT\u PER\u DAY\u HOUR
应包含按
QUEUE
分组的天数(
DAY
)中相应的
HOUR
值的平均计数。例如,在
df
中,在
ABC123
的情况下,
小时
7在
1出现2次,在
2出现0次。因此,平均值为1。同样的逻辑也适用于
HOUR
8。对于
ABC123
,它在
天出现1次,在
天出现0次。因此,平均值为0.5

AVG_PERCENT_EVAL_1
应包含
EVAL
在小时内等于1的百分比,按
队列
分组。例如,在
ABC123
的情况下,当
HOUR
为7时,
EVAL
等于1次。当
HOUR
为7时,一次也等于0。因此,
ABC123
和第7小时的平均评估百分比1
为50

我使用这种方法:

df = pd.lreshape(aa, {'QUEUE': df.columns[df.columns.str.startswith('QUEUE')].tolist()})
piv_df = df.pivot_table(index=['QUEUE'], columns=['HOUR'], fill_value=0)
result = piv_df.stack().add_prefix('AVG_').reset_index()
我一直在添加列
AVG\u COUNT\u PER\u DAY\u HOUR
AVG\u PERCENT\u EVAL\u 1
。例如,要添加列
AVG\u COUNT\u PER\u DAY\u HOUR
我想使用
.apply(pd.value\u counts,1).notnull().groupby(level=0.sum().astype(int)
,而在计算
AVG\u PERCENT\u EVAL\u 1
时,我想使用
[df.EVAL==1].agg({'EVAL':'COUNT})
。但是,我不知道如何将它合并到我当前的代码中以获得正确的解决方案

更新:

也许采用这种解决方案更容易解决我在这些问题中需要的问题:

result = pd.lreshape(df, {'QUEUE': ['QUEUE_1','QUEUE_2']})

mux = pd.MultiIndex.from_product([result.QUEUE.dropna().unique(), 
                                  result.dropna().DAY.unique(),
                                  result.HOUR.dropna().unique(), ], names=['QUEUE','DAY','HOUR'])

print (result.groupby(['QUEUE','DAY','HOUR'])
             .mean()
             .reindex(mux, fill_value=0)
             .add_prefix('AVG_')
             .reset_index())
步骤:

1) 要计算每小时平均计数,请执行以下操作:

在的帮助下,计算按队列分组的小时w.r.t天的不同计数(以便我们获得缺失天数的案例)

stack
DF
这样,以前属于层次结构列的小时现在被定位为索引,只剩下天数作为列。在用0填充
NaNs
后,我们取平均值

2) 要计算平均百分比评估值1:

在获得旋转帧(与之前相同)后,并且由于均值只会给我们百分比变化,因为它们本质上是二进制的(1/0),我们只需从这个
DF
中取EVAL,并将其结果乘以100,因为在旋转自身时计算均值(默认
agg
=
np.mean

最后,我们连接所有这些框架


与链接帖子中的内容相同:

附加部分:


avg_cnt
看起来像:

QUEUE   HOUR
ABC123  7       1.0
        8       0.5
DEF656  7       0.5
        8       1.0
FED456  7       0.0
        8       0.5
dtype: float64
QUEUE   HOUR
ABC123  7        50
        8         0
DEF656  7       100
        8        50
FED456  7         0
        8       100
Name: EVAL, dtype: int32
avg_pct
看起来像:

QUEUE   HOUR
ABC123  7       1.0
        8       0.5
DEF656  7       0.5
        8       1.0
FED456  7       0.0
        8       0.5
dtype: float64
QUEUE   HOUR
ABC123  7        50
        8         0
DEF656  7       100
        8        50
FED456  7         0
        8       100
Name: EVAL, dtype: int32

非常感谢。我可以请您简要解释一下您的代码吗?我是否正确理解在
pd.crosstab
之前,我应该运行
df=pd.lreshape(df,{'QUEUE':df.columns[df.columns.str.startswith('QUEUE')].tolist())
?再来一条注释。当我运行上一个线程中的原始代码(您建议的代码)时,我会得到不同的
AVG_TOTAL_SERVICE_TIME
AVG_TOTAL_WAIT_TIME
,但它们必须相同。我引用了以下代码:
df=pd.lreshape(aa,{'QUEUE':df.columns[df.columns.str.startswith('QUEUE')].tolist())piv_df=df.pivot_表(index=['QUEUE'],columns=['HOUR'],fill_value=0)result=piv_df.stack()。添加前缀('AVG_u')。重置索引()
。感谢您的详细解释,但是我不明白为什么从我以前的线程(你建议的线程)中提取的原始代码给了我不同的
AVG\u TOTAL\u SERVICE\u TIME
AVG\u TOTAL\u WAIT\u TIME
。可能会发生这样的情况:在这里,您可以通过在
天和
小时内求平均值来计算这两列的平均值,而我最初想在
小时内求平均值。哦,我终于发现了一个错误。是我的错。只是忘记删除一行执行过滤的代码。非常感谢。
QUEUE   HOUR
ABC123  7        50
        8         0
DEF656  7       100
        8        50
FED456  7         0
        8       100
Name: EVAL, dtype: int32