python - 如何比较两个数据框并返回有差异的列?
问题描述
我正在准备一个数据框来存储员工技能的变化。
我想比较带有这些标签的两个表:“员工姓名”、“技能名称”、“年份”和“分数”。在第二年雇用了一些员工,并增加了一些技能。我想检查两个数据框中是否缺少员工或技能并填补空白,以便数据框的形状相同。
dataset = dataset[['Employee Name', 'Skill Name', 'Year', 'Score']]
min_y = dataset['Year'].min()
max_y = dataset['Year'].max()
ds1 = ds1.sort_values(['Employee Name', 'Skill Name'], ascending=[True, False])
ds2 = ds2.sort_values(['Employee Name', 'Skill Name'], ascending=[True, False])
ds1 = dataset[dataset['Year']==min_y].reset_index().drop(['index'], axis=1).drop(['Year'], axis=1)
ds2 = dataset[dataset['Year']==max_y].reset_index().drop(['index'], axis=1).drop(['Year'], axis=1)
dsBool = (ds1 != ds2).stack()
dsdiff = pd.concat([ds1.stack()[dsBool], ds2.stack()[dsBool]], axis=1)
dsdiff.columns=["Old", "New"]
目前比较这两个表会导致错误,因为两个 DataFrame 之间的形状不同:Can only compare same-labeled DataFrame objects
解决方案
据了解,形状错误是由于增加了新员工和更新现有员工的技能。要找出缺失值,您可以加入这些数据框,然后删除重复的条目。这样,剩下的唯一条目将是两个数据帧中不同的条目。
temp = pd.concat((ds1, ds2), axis = 0)
temp = temp.drop_duplicates(subset = 'Employee Name', keep = False, inplace = True)
# keep = False ensures that all repeating entries are considered duplicates
临时数据帧现在由初始 2 个数据帧中不同的所有条目组成。可以在其形状匹配的那些数据框中搜索和编辑它们。
推荐阅读
- javascript - 在 Vue 组件中加载外部脚本
- javascript - 是否可以在不使用任何扩展程序的情况下在任何浏览器中以私有模式打开 url
- sql - 删除旧的 MongoDB 文档
- python-3.x - 我想向下滚动直到最后一个“加载更多”按钮并抓取链接
- ios - 更改 @Published 时重新加载视图
- php - 如何在最小和最大预算范围内编写接收有关一位制片人电影数据的请求
- python - 使用 spacy 从文档中删除复合词命名实体
- java - Jar 文件可在 Windows 上运行,但不能在 Ubuntu 上运行(JDK 1.8,使用 NetBeans 编译)
- c# - 如何在泛型方法中传递继承类型
- java - Spring WS - EndpointInterceptor 未调用