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