【问题标题】:Combine multiple rows into Single row using particular column in python使用python中的特定列将多行组合成单行
【发布时间】:2021-07-10 05:05:18
【问题描述】:

我需要将两条记录合并为一条记录。我有一个 Billable 列值为“Yes”和“No

如果值为“Yes”,那么它将逐行求和并创建新列为“Billable

计费 = df[计费] * sum/168 * 100

如果值为“No”,那么它将逐行求和并创建新列为“Non-Billable”。

非计费 = df[非计费] * sum/ 168 * 100

数据:

|Employee Name  |    Java  |  Python  | .Net  |  React |  Billable|                                  
|Priya          |    10    |          |   5   |        |  Yes     |                     
|Priya          |          |  10      |       |     5  |  No      |  
|Krithi         |          |   10     |   20  |        |  No      |  

                                             

输出

Priya 可计费和不可计费,priya 名称出现在两行中。我需要在单行中与员工姓名合并。所以预期的输出应该是

| Employee Name |   Java    | Python    |.Net   | React | Total       |Billing      | Non-Billing|     
| Priya         |   10      | 10        | 5     | 5     | 30          |8.928571429  | 8.928571429|     
| Krithi        |   10      | 20        |       |       | 30          |             | 17.85714286|

预期输出的可计费和不可计费数据应位于单行中。

Expected Output

但是我得到了两行 Billable 和 Non-Billable 的输出

Current Output i am getting

total=df.sum(axis=1)
df.insert(len(df.columns),column='Total',value=total)

x = (Billable_cal.loc[:,:].sum(axis=1)/available*100).round(2)
df["Billing"] = np.where(df["Billable"] == "Yes", x, "")
df["Non Billing"] = np.where(df["Billable"] == "No", x, "")

【问题讨论】:

    标签: python-3.x pandas dataframe numpy merge


    【解决方案1】:

    首先由Employee Name 聚合到df1,然后由Billablenumpy.where 聚合,对于sum 每两列,对所有列求和,由Series.unstack 重塑,除法和倍数,最后添加到df1 以获得最终输出:

    df1 = df.groupby('Employee Name', sort=False).sum(min_count=1)
    
    df['Billable'] = np.where(df['Billable'] == 'Yes', 'Billing','Non-Billing')
    
    df2 = (df.groupby(['Employee Name','Billable'])
            .sum()
            .sum(axis=1)
            .unstack()
            .div(168)
            .mul(100))
    
    df = df1.join(df2).reset_index()
    print (df)
      Employee Name  Java  Python  .Net  React   Billing  Non-Billing
    0         Priya  10.0    10.0   5.0    5.0  8.928571     8.928571
    1        Krithi   NaN    10.0  20.0    NaN       NaN    17.857143
    

    【讨论】:

    • 非常感谢 jezrael 的帮助,我的 Utilization 列为 168。如果员工同时有计费和不可计费,则 Utilization 列尝试将值相加为 336。我不需要总和利用率列的值。该怎么做?
    • 'df2 = (df.groupby(['Employee Name','Billable'])['Java','Python','.Net','React'].sum()。 sum(axis=1).unstack().div(168).mul(100)).round(2)'
    • @Gomathi 你认为是 Total 专栏吗?不知道是否明白。
    • 不,还有另一个列名为“Utilization”,整个列的值为 168。如果员工同时具有 Billable 和 Non-Billable 值,它会计算 (168+168 = 336),但我只需要 168 用于此列。 输出:|员工姓名 |爪哇 |蟒蛇 | .Net |反应 |总计 |利用率 |普里亚 | 10 | 10 | 5 | 5 | 30 | 336 |金额 |计费 |非计费 |17.85% |8.928571429 |8.928571429
    • @Gomathi - 此列在输入数据中?并且列中的所有值都相同 - 168?
    猜你喜欢
    • 2023-03-09
    • 2013-12-31
    • 2021-10-04
    • 1970-01-01
    • 2015-11-07
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多