我有两个表。第一个参考表如下:
| Name | Target | Bonus |
|------|--------:|------:|
| Joe | 40 | 46 |
| Phil | 38 | 42 |
| Dean | 65 | 70 |
字符串
生成表格的Python代码是:
# Data for the table
data = {
'Name': ['Joe', 'Phil', 'Dean'],
'Target': [40, 38, 65],
'Bonus': [46, 42, 70]
}
# Creating the DataFrame
ref = pd.DataFrame(data)
型
我的第二个表格如下:
| week | Metrics | Joe | Dean |
|------------|---------|----:|-----:|
| 11/6/2023 | Target | 40 | 65 |
| 11/6/2023 | Bonus | 46 | 70 |
| 11/6/2023 | Score | 33 | 71 |
| 11/13/2023 | Target | 40 | NaN |
| 11/13/2023 | Bonus | 46 | NaN |
| 11/13/2023 | Score | 45 | NaN |
| 11/20/2023 | Target | 40 | 65 |
| 11/20/2023 | Bonus | 46 | 70 |
| 11/20/2023 | Score | 35 | 68 |
| 11/27/2023 | Target | NaN | 65 |
| 11/27/2023 | Bonus | NaN | 70 |
| 11/27/2023 | Score | NaN | 44 |
| 12/4/2023 | Target | 40 | 65 |
| 12/4/2023 | Bonus | 46 | 70 |
| 12/4/2023 | Score | 42 | 66 |
型
生成这个表的Python代码是:
# Data for the new table
data = {
'week': ['11/6/2023', '11/6/2023', '11/6/2023', '11/13/2023', '11/13/2023', '11/13/2023',
'11/20/2023', '11/20/2023', '11/20/2023', '11/27/2023', '11/27/2023', '11/27/2023',
'12/4/2023', '12/4/2023', '12/4/2023'],
'Metrics': ['Target', 'Bonus', 'Score', 'Target', 'Bonus', 'Score',
'Target', 'Bonus', 'Score', 'Target', 'Bonus', 'Score',
'Target', 'Bonus', 'Score'],
'Joe': [40, 46, 33, 40, 46, 45, 40, 46, 35, None, None, None, 40, 46, 42],
'Dean': [65, 70, 71, None, None, None, 65, 70, 68, 65, 70, 44, 65, 70, 66]
}
# Creating the DataFrame
df = pd.DataFrame(data)
型
正如你所看到的,Dean有一周的Target、Bonus和Score单元格是空的。Joe在接下来的一周也是如此。在这些单元格为NaN的特定情况下,我想使用以下规则填充它们:
- 从第一个参考表中获取每个人的Target和Bonus单元格值,并相应地填充NaN单元格。
- 将Score单元格设置为等于人员的Target单元格值。
我想要的输出表看起来像这样:
| week | Metrics | Joe | Dean |
|------------|---------|----:|-----:|
| 11/6/2023 | Target | 40 | 65 |
| 11/6/2023 | Bonus | 46 | 70 |
| 11/6/2023 | Score | 33 | 71 |
| 11/13/2023 | Target | 40 | 65 |
| 11/13/2023 | Bonus | 46 | 70 |
| 11/13/2023 | Score | 45 | 65 |
| 11/20/2023 | Target | 40 | 65 |
| 11/20/2023 | Bonus | 46 | 70 |
| 11/20/2023 | Score | 35 | 68 |
| 11/27/2023 | Target | 40 | 65 |
| 11/27/2023 | Bonus | 46 | 70 |
| 11/27/2023 | Score | 40 | 44 |
| 12/4/2023 | Target | 40 | 65 |
| 12/4/2023 | Bonus | 46 | 70 |
| 12/4/2023 | Score | 42 | 66 |
型
4条答案
按热度按时间xdyibdwo1#
每列最多只有一个NaN块
另一种可能的解决方案,循环遍历对应于每个人的
df
列,并为NaN
的每个块(由loc
标识)分配ref
中相应的值块(也由loc
标识):字符串
一般情况
如果每个人有多个
NaN
块,我们需要稍微修改代码:型
编辑
为了满足OP的新要求:而不是为了目标,奖金和分数,它需要的顺序奖金,目标和分数。在这种情况下,我们需要重新调整以前的代码:
型
输出量:
型
n9vozmp42#
我已经将第二个 Dataframe 的名称更改为df2,因为我们不能使用相同的名称:
字符串
这应该符合你的目的。
5cnsuln73#
字符串
我保留了最后两列(没有下降到位),所以你可以看到发生了什么与这些左合并和如何fillna工程。
应该有一个更干净的解决方案和一个更紧凑的,但作为一个灵感,这可能对你有用。
型
rsl1atfo4#
试试这个:
1.从'ref'创建引用Map:
字符串
2.在DataFrame 'df'中为每个指定人员的列填充''
型
3.使用引用Map“ref_map”替换“df”中的值
型