python - 将值从小数据帧映射到大数据帧
问题描述
我有两个数据框。DF1:
Page LineNum Value
1 1 0.5
1 2 0.6
1 3 0.7
2 1 0.9
2 2 0.4
DF2:初始数据框是前三列,我必须生成名为 New_Value 的第四列。
Page LineNum Word New_Value
1 1 g1 0.5
1 1 g2 0.5
1 1 g3 0.5
1 1 g4 0.5
1 2 g5 0.6
1 2 g6 0.6
1 3 g7 0.7
1 3 g8 0.7
...
我必须生成 DF2 的第四列,它实际上是从 DF1 的唯一“Page”和“LineNum”值映射的。在 DF2 中,这些值只是根据 DF1 中关于“Page”和“LineNum”的唯一值重复。
我目前正在通过 for 循环执行此操作:
for index, row in DF1.iterrows():
DF2.ix[((DF2['Page'] == row['Page']) & (DF2['LineNum'] == row['LineNum'])),['New_Value']] = row['Value']
这工作得很好,但是两个数据框都非常大。所以我需要一些优化的功能,也许使用 groupby 和 lambda 但无法设计出确切的功能。
请建议一个没有 For 循环的优化版本。如果我需要对此进行解释,请发表评论。我正在使用 Python3 和熊猫。
解决方案
我认为需要merge
左连接:
df = (df2.merge(df1.rename(columns={'Value':'New_Value'}),
on=['Page','LineNum'], how='left'))
print (df)
Page LineNum Word New_Value
0 1 1 g1 0.5
1 1 1 g2 0.5
2 1 1 g3 0.5
3 1 1 g4 0.5
4 1 2 g5 0.6
5 1 2 g6 0.6
6 1 3 g7 0.7
7 1 3 g8 0.7
推荐阅读
- python-3.x - 添加角度后计算位置
- c# - Blazor EditForm 验证仅在使用“验证器组件”时部分有效(在“业务逻辑验证”函数中)
- vue.js - 如何在 vue3 的设置中强制更新?
- redis - 持久化 Redis Bloom 过滤器数据的最佳方法?
- php - 如何告诉 Eclipse PDT 名称空间验证的根路径在哪里?
- php - 在获得响应时将 NULL 转换为空字符串
- graph - 噪声最大或噪声或泛化的示例
- bash - 使用 bash 脚本和打印从目录中查找丢失的文件
- express - 是否有优雅重新加载 pm2 的解决方案?
- java - 缺少具有匹配变量名称的 URI 模板变量