Groupby 单列并使用 Pandas 合并
Posted
技术标签:
【中文标题】Groupby 单列并使用 Pandas 合并【英文标题】:Groupby single column and merge using Pandas 【发布时间】:2022-01-15 16:14:18 【问题描述】:我有一个数据框 df,我需要明智地合并部门
输入
我的输出
预期输出
【问题讨论】:
在合并中参与 两个 DataFrame。您未能显示第二个 DataFrame(与您合并您的第一个 DataFrame。另一个需要更正的细节:将您的源数据(两个 DataFrame)作为 文本,而不是图片。我们既没有时间也不想从图片中重写你的源数据。并展示你到目前为止尝试过的代码。更多细节:你的输出和期望的输出有什么区别? @gomathi,您是在问如何在 excel 输出中合并 cells 吗? 是的@Jayvee,我想合并单元格 @Gomathi 您可能需要使用 openpyxl 或 xslxwriter 来完成。这个答案可能会有所帮助:***.com/questions/61217923/… 【参考方案1】:看起来你不想要任何合并,但你想做类似的事情 “unstack” Projects 列,针对每个 Department 和 Employee 和 添加一些派生数据。
按如下方式进行:
定义一个函数以将数字格式化为带有 2 位小数的百分比:
def perc2(n):
return f'n * 100:.2f%'
定义一个组处理函数:
def grpProc(grp):
billSum = grp.groupby('Billable').Hours.sum()
s = grp.set_index('Projects').Hours.rename('')
s.index.name = None
s['Total'] = s.sum()
s['Available'] = 168
s['Utilization'] = perc2(s.Total/s.Available)
s['Billable Utilization'] = perc2(billSum['Yes'] / 168)\
if 'Yes' in billSum.index else ''
s['Non Billable Utilization'] = perc2(billSum['No'] / 168)\
if 'No' in billSum.index else ''
return s
要生成结果,请将源 DataFrame 分组并应用 对每个组进行上述功能:
result = df.groupby(['Department Name', 'Employee Name'], sort=False)\
.apply(grpProc).reset_index()
为了测试我的代码,我提取了您的数据子集,稍作改动:
Employee Name Department Name Projects Billable Hours
0 Anu Maths Project1 Yes 56.00
1 Anu Maths Project2 Yes 61.00
2 Anu Maths Project3 Yes 62.00
3 Bala Maths Project1 Yes 70.00
4 Bala Maths Project2 Yes 69.00
5 Bala Maths Project3 Yes 61.67
6 Ravi Commerce Project1 Yes 64.00
7 Ravi Commerce Project2 Yes 42.00
8 Ravi Commerce Project3 No 62.00
我得到的结果是:
Department Name Employee Name Project1 Project2 Project3 Total Available Utilization Billable Utilization Non Billable Utilization
0 Maths Anu 56.0 61.0 62.00 179.00 168.0 106.55% 106.55%
1 Maths Bala 70.0 69.0 61.67 200.67 168.0 119.45% 119.45%
2 Commerce Ravi 64.0 42.0 62.00 168.00 168.0 100.00% 63.10% 36.90%
【讨论】:
以上是关于Groupby 单列并使用 Pandas 合并的主要内容,如果未能解决你的问题,请参考以下文章
使用 pandas groupby 查找列的唯一组合并另存为 df