熊猫 - 加入两个数据框,然后按日期转置

时间:2021-06-29 10:22:15

标签: python pandas

我有两个熊猫数据框。首先有数据人那天花了多少小时做某事。 第二个数据框是一天的总和以及该人实际工作的时间。这里的例子:

df_1:
| name | id | description    | hours_worked | date       |
| ---- | -- | -------------- | ------------ | ---------- |
| John | 1  | implementation | 5            | 2020-11-16 |
| John | 1  | refactor       | 3            | 2020-11-16 |    
| John | 1  | implementation | 8            | 2020-11-17 |
| Paul | 2  | refactor       | 4            | 2020-11-16 |

df_2:
| name | id | hours_charged  | hours_worked | date       |
| ---- | -- | -------------- | ------------ | ---------- |
| John | 1  | 8              | 8            | 2020-11-16 |   
| John | 1  | 8              | 8            | 2020-11-17 |
| Paul | 2  | 8              | 4            | 2020-11-16 |

有什么办法可以将这两个 DF 结合起来得到这个结果:

df_final:
| name | id | description      | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday |
| ---- | -- | ---------------- | ------ | ------  | --------- | -------- | ------ | -------- | ------ |
| John | 1  | hours_worked     |   8    | 8       | 0         | 0        | 0      | 0        | 0      | 
| John | 1  | hours_charged    |   8    | 8       | 0         | 0        | 0      | 0        | 0      | 
| John | 1  | implementation   |   5    | 8       | 0         | 0        | 0      | 0        | 0      | 
| John | 1  | refactor         |   3    | 0       | 0         | 0        | 0      | 0        | 0      | 
| Paul | 2  | hours_worked     |   4    | 0       | 0         | 0        | 0      | 0        | 0      | 
| Paul | 2  | hours_charged    |   8    | 0       | 0         | 0        | 0      | 0        | 0      |     
| Paul | 2  | refactor         |   4    | 0       | 0         | 0        | 0      | 0        | 0      | 

基本上转置日期,然后从 hours_worked、hours_charged 获取行数据,然后根据描述列出所有 hours_worked。我试图合并两个 DF,但我不知道如何以这种方式转置。

1 个答案:

答案 0 :(得分:1)

使用 DataFrame.melt 进行第二个 $options = collection(range(1, 12)) ->map(function ($val) { return sprintf('%02d', $val); }) ->indexBy(function ($val) { return $val; }) ->toArray(); 的逆透视,通过 concat 加入,通过 Series.dt.day_name 转换日期时间并使用 DataFrame.pivot_table 和一些聚合函数,例如df,最后按列表添加缺失的列:

sum