python - Python Pandas - 在一个步骤中结合合并和过滤
问题描述
在下面的一段代码中:
df_emp11 = pd.read_table("C...PyCharm2018.3/config/scratches/dataset3", engine="python", sep = ',', usecols = ['EmpID','Name','Salary'])
df_emp12 = pd.read_table("...PyCharm2018.3/config/scratches/dataset4", engine="python" , sep = ',',usecols = ['EmpID','Name','Salary'])
df = pd.merge(df_emp11, df_emp12, on=['EmpID'] , how='outer', indicator=True)
df = df[df.Salary_x !=df.Salary_y]
有没有一种方法可以编写类似 SQL 的查询,而不是pd.merge
在一个步骤中使用并在最后一步中过滤掉记录:
Select * from df_emp11 left join df_emp12
on df_emp11.Name = df_emp12.Name
where df_emp11.Salary != df_emp12.Salary
我正在努力提高内存效率!
样本数据:set1:
EmpID,Name,Salary
123,Allan,8890
234,Thomas,9990
345,Bill,7789
445,Bill,9980
设置2:
EmpID,Name,Salary
123,Allan,8890
234,Thomas,9990
345,Bill,778
预期输出:
EmpID Name_x Salary_x Name_y Salary_y
345 Bill 7789 Bill 778.0
445 Bill 9980 NaN NaN
解决方案
除了用于连接表的列之外,查询看起来很好。在 pandas 中,您用作EmpID
合并的键,但您的查询使用了该Name
列。所以查询应该是这样的(虽然我没有测试过):
SELECT df_emp11.EmpID, df_emp11.Name, df_emp11.Salary, df_emp12.Name, df_emp12.Salary
FROM df_emp11
LEFT JOIN df_emp12
ON df_emp11.EmpID = df_emp12.EmpID
WHERE df_emp11.Salary != df_emp12.Salary
另外,我不知道您使用的是什么 SQL 引擎。如果您碰巧使用PostgreSQL
,那么您必须引用包含大写字符的列名。例如df_emp11.EmpID
=>df_emp12."EmpID"
推荐阅读
- html - 将 html 字符集设置为 utf-8 不起作用
- python - 如何根据位置条件有效地连接 Numpy Array?
- python-3.x - Pyinstaller 可执行文件因 pkg_resources.DistributionNotFound 错误而失败
- oauth-2.0 - oAuth with Microsoft Azure AD with azure GUEST 帐户与员工帐户
- arrays - 如何分离嵌套在 API 对象中的元素
- node.js - 从 Cognito 收到 JWT Token 后如何存储?通过 Cognito 托管 UI 登录
- powershell - 用于删除 Key Vault 机密的 PowerShell 脚本出现 409 冲突错误
- r - 按字数和堆积条形图
- android - 如何将 android 应用程序限制为特定品牌?
- flutter - Flutter:带安全区域的全底按钮