Python 中的左联接中存在不匹配的左表记录

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

我有两个数据框,“学生”数据框和“费用”数据框。“费用”数据框中缺少一些学生的费用详细信息。我想返回所有学费信息缺失的学生的详细信息。三个字段“Class”、“Section”和“RollNo”构成一个独特的组合

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