python - 根据条件更新数据框列的有效方法
问题描述
如果第二帧的条件适用,我想更新一个数据帧的值。
现在我正在遍历第二帧的每一行以找到它在第一帧中的位置,并在找到它时更新该行,但这是非常低效的资源。
有没有更好的合并方法?
例如,对于在 T2 中找到的值,我想在 T1 中将解析更新为“是”
T1
user_id version issue Resolved
1 12345 crash no
2 12346 printing no
3 12347 screen no
3 12348 screen no
T2
user_id version issue
1 12345 crash
2 12346 printing
谢谢!!
预期输出:
T1
user_id version issue Resolved
1 12345 crash yes
2 12346 printing yes
3 12347 screen no
3 12348 screen no
解决方案
您可以在新数据中添加一个 yes 解析,然后将两者结合起来
T2['Resolved'] = 'yes'
dtypes = T1.dtypes.combine_first(T2.dtypes)
T3 = T2.combine_first(T1)
for k, v in dtypes.iteritems():
T3[k] = T3[k].astype(v)
输出:
user_id version issue Resolved
0 1 12345 crash yes
1 2 12346 printing yes
2 3 12347 screen no
3 3 12348 screen no
我找到了一种无需转换回浮点数的组合方法:
T3 = T2.astype('object').combine_first(T1)
所以你不应该再需要 for 循环了
在 combine_first 不起作用的地方检查这个解决方案。我创建了一个映射到是并将它们应用到第一帧:
T1 = pd.DataFrame({'A': [1,1,2,3], 'B': ['no', 'no','no','no'], 'C': ['no1', 'no2','no3','no4']})
T2 = pd.DataFrame({'A': [2, 3], 'B': ['yes','yes']})
mapitems = T2.set_index('A').to_dict()['B']
T1['B'] = T1.apply(lambda x: mapitems[x.A] if x.A in mapitems.keys() else x.B, axis=1)
推荐阅读
- sql - 在 T SQL 中的我的日期列上获取时间戳 23:59:59
- mysql - SQL、主键、外键和表
- ios - 有没有办法在 SwiftUI 中制作 List 样式 insetGrouped?
- react-native - 需要升级现有项目的RN版本
- c# - LINQ中的内部连接后如何将相同的结果组合成一行
- python - 在游戏设计中,我们是否必须在每一帧中重新绘制整个窗口?
- django - Docker:从 Web 容器内部执行 django 迁移到 db 容器
- python - Visual Studio 16.3.4 + Python Tools 16.3 交互式窗口中断调试
- php - 如何在 laravel 6 中安装 brozot/Laravel-FCM?
- sql - SQL SERVER:当数据包含空值时如何选择数据