首页 > 解决方案 > 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  

标签: pythonsqlpandas

解决方案


除了用于连接表的列之外,查询看起来很好。在 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"


推荐阅读