我有两个熊猫数据框。首先有数据人那天花了多少小时做某事。 第二个数据框是一天的总和以及该人实际工作的时间。这里的例子:
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,但我不知道如何以这种方式转置。
答案 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