Python 中的左联接中存在不匹配的左表记录
我有两个数据框,“学生”数据框和“费用”数据框。“费用”数据框中缺少一些学生的费用详细信息。我想返回所有学费信息缺失的学生的详细信息。三个字段“Class”、“Section”和“RollNo”构成一个独特的组合Python 中的左联接中存在不匹配的左表记录,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据框,“学生”数据框和“费用”数据框。“费用”数据框中缺少一些学生的费用详细信息。我想返回所有学费信息缺失的学生的详细信息。三个字段“Class”、“Section”和“RollNo”构成一个独特的组合 Students = pd.DataFrame({ 'Class': [7, 7, 8], 'Section': ['A', 'B', 'B'], 'RollNo': [2, 3, 4], 'Student': ['Ram', 'Rahim', 'Rob
Students = pd.DataFrame({
'Class': [7, 7, 8],
'Section': ['A', 'B', 'B'],
'RollNo': [2, 3, 4],
'Student': ['Ram', 'Rahim', 'Robert']
})
Fee = pd.DataFrame({
'Class': [7, 7, 8],
'Section': ['A', 'B', 'B'],
'RollNo': [2, 2, 3],
'Fee': [10, 20, 30]
})
基本上,当我基于上述3个字段在“学生”和“费用”数据帧之间进行左连接时,我希望从左表中找到不匹配的记录。使用Python中的熊猫实现这一点的最简单方法是什么
多谢各位 如果数据帧中的
Fee
列中没有NaN
s,则使用anf过滤器:
使用NaN
s的更通用的解决方案也将参数指示器添加到合并中,并仅使用左
过滤行:
Fee = pd.DataFrame({'Class':[7,7,8],
'Section':['A','B','B'],
'RollNo':[2,2,3],
'Fee':[np.nan,20,30]})
print (Fee)
Class Fee RollNo Section
0 7 NaN 2 A
1 7 20.0 2 B
2 8 30.0 3 B
df = pd.merge(Students, Fee, how='left', indicator=True)
print (df)
Class RollNo Section Student Fee _merge
0 7 2 A Ram NaN both
1 7 3 B Rahim NaN left_only
2 8 4 B Robert NaN left_only
df1 = df[df['_merge'].eq('left_only')].drop(['Fee','_merge'], axis=1)
print (df1)
Class RollNo Section Student
1 7 3 B Rahim
2 8 4 B Robert
我对这个概念很感兴趣
选择1
将pandas.concat
与键一起使用
参数
确保Students
s部分获得结果多索引的第一级的值stu'
使用pandas.DataFrame.drop_duplicates
和参数keep=False
删除所有重复项
通过使用loc
将注意力集中在学生部分
选择2
使用元组列表上的集合,获取差异并与人造数据帧合并
cols = ['Class', 'RollNo', 'Section']
s = set(map(tuple, Students[cols].values))
f = set(map(tuple, Fee[cols].values))
Students.merge(pd.DataFrame(list(s - f), columns=cols))
Class RollNo Section Student
0 7 3 B Rahim
1 8 4 B Robert
df = pd.merge(Students, Fee, how='left')
print (df)
Class RollNo Section Student Fee
0 7 2 A Ram 10.0
1 7 3 B Rahim NaN
2 8 4 B Robert NaN
df1 = df[df['Fee'].isna()].drop('Fee', axis=1)
#for oldier versions of pandas
#df1 = df[df['Fee'].isnull()].drop('Fee', axis=1)
print (df1)
Class RollNo Section Student
1 7 3 B Rahim
2 8 4 B Robert
Fee = pd.DataFrame({'Class':[7,7,8],
'Section':['A','B','B'],
'RollNo':[2,2,3],
'Fee':[np.nan,20,30]})
print (Fee)
Class Fee RollNo Section
0 7 NaN 2 A
1 7 20.0 2 B
2 8 30.0 3 B
df = pd.merge(Students, Fee, how='left', indicator=True)
print (df)
Class RollNo Section Student Fee _merge
0 7 2 A Ram NaN both
1 7 3 B Rahim NaN left_only
2 8 4 B Robert NaN left_only
df1 = df[df['_merge'].eq('left_only')].drop(['Fee','_merge'], axis=1)
print (df1)
Class RollNo Section Student
1 7 3 B Rahim
2 8 4 B Robert
catted = pd.concat([Students, Fee], keys=['stu', 'fee'])
dropped = catted.drop_duplicates(['Class', 'RollNo', 'Section'], keep=False)
index = dropped.loc['stu'].index
Students.loc[index]
Class RollNo Section Student
1 7 3 B Rahim
2 8 4 B Robert
cols = ['Class', 'RollNo', 'Section']
s = set(map(tuple, Students[cols].values))
f = set(map(tuple, Fee[cols].values))
Students.merge(pd.DataFrame(list(s - f), columns=cols))
Class RollNo Section Student
0 7 3 B Rahim
1 8 4 B Robert