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 列,针对每个 DepartmentEmployee 和 添加一些派生数据。

按如下方式进行:

    定义一个函数以将数字格式化为带有 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 合并的主要内容,如果未能解决你的问题,请参考以下文章

将 2 列中的值合并为 pandas 数据框中的单列

第十三节 pandas分组和分组统计以及多数据源合并

Pandas实现groupby分组聚合后不同列数据统计

使用 pandas groupby 查找列的唯一组合并另存为 df

pandas GroupBy上的方法apply:一般性的“拆分-应用-合并”

pandas.groupby中的迭代