我正在处理像这样的pandas数据框:
Day Hour Prio Value
0 1 6 Critical 1
1 1 16 Critical 1
2 1 17 Content 1
3 1 17 Low 1
6 1 19 Critical 1
7 1 20 High 1
8 2 10 High 1
9 2 10 Low 2
现在我希望按天和小时进行分组,同时生成代表Prio
列中每个值的计数的新列,这些列当前存在于value
列中。所以我想实现这个结构:
Day Hour Critical Content Low High
0 1 6 1 0 0 0
1 1 16 1 0 0 0
2 1 17 0 1 1 0
6 1 19 1 0 0 0
7 1 20 0 0 0 1
8 2 10 0 0 2 1
我现在尝试了不同的东西,但并没有相当成功。我的目标是将此数据框与按日和小时包含其他列的另一个数据框合并,以便进一步聚合它们。特别是我需要优先级中每天/每小时的百分比份额(至少有一个非零值始终存在)。
在过去的解决方案中,我在每行迭代以提取单个值,但这一点相当慢。我希望尽可能保持高效,因为数据应该在散景服务器应用程序中实时更新。也许有一个解决方案没有使用itertuples
或类似的东西?谢谢!
答案 0 :(得分:2)
df.groupby(['Day','Hour','Prio']).sum().unstack().fillna(0).astype(int)
# Value
#Prio Content Critical High Low
#Day Hour
#1 6 0 1 0 0
# 16 0 1 0 0
# 17 1 0 0 1
# 19 0 1 0 0
# 20 0 0 1 0
#2 10 0 0 1 2
如果需要,您可以进一步重置索引。
答案 1 :(得分:2)
或者你可以尝试
pd.pivot_table(df,values='Value',index=['Day','Hour'],columns=['Prio'],aggfunc='sum')\
.fillna(0).astype(int)
Out[22]:
Prio Content Critical High Low
Day Hour
1 6 0 1 0 0
16 0 1 0 0
17 1 0 0 1
19 0 1 0 0
20 0 0 1 0
2 10 0 0 1 2
答案 2 :(得分:1)
让我们使用set_index
,unstack
,reset_index
和rename_axis
:
df.set_index(['Day','Hour','Prio'])['Value']\
.unstack().fillna(0)\
.astype(int).reset_index()\
.rename_axis(None,1)
输出:
Day Hour Content Critical High Low
0 1 6 0 1 0 0
1 1 16 0 1 0 0
2 1 17 1 0 0 1
3 1 19 0 1 0 0
4 1 20 0 0 1 0
5 2 10 0 0 1 2