我正在将 2 个 CSV 文件与 pandas python 进行比较,一切正常。它匹配 employee_id 列并将结果输出到 csv 文件
df1 = pd.read_csv('input1.csv', sep=',\s+', delimiter=',', encoding="utf-8")
df2 = pd.read_csv('input2.csv', sep=',\s,', delimiter=',', encoding="utf-8")
df3 = pd.merge(df1,df2, on='employee_id', how='right')
df3.to_csv('output.csv', encoding='utf-8', index=False)
当它找不到匹配项时,它返回一个空白结果,我希望它返回 not_found
这对 Pandas 来说可能吗?还是我应该在之后做一些处理?
最佳答案
我想你可以使用 fillna
如果 df1
中没有 NaN
:
df1 = pd.DataFrame({'employee_id':[1,2,3],
'B':[4,5,6],
'C':[7,8,9]})
print (df1)
B C employee_id
0 4 7 1
1 5 8 2
2 6 9 3
df2 = pd.DataFrame({'employee_id':[1,4,6],
'D':[4,5,6],
'E':[7,8,9]})
print (df2)
D E employee_id
0 4 7 1
1 5 8 4
2 6 9 6
df3 = pd.merge(df1,df2, on='employee_id', how='right')
df3[df1.columns] = df3[df1.columns].fillna('not_found')
print (df3)
B C employee_id D E
0 4 7 1 4 7
1 not_found not_found 4 5 8
2 not_found not_found 6 6 9
但是,如果 df1
中的 NaN
是必需的,则需要创建掩码以识别 right
连接中的缺失值 - 使用参数 indicator=True
在merge
或 isin
并通过 ~
否定掩码:
df1 = pd.DataFrame({'employee_id':[1,2,3],
'B':[np.nan,5,6],
'C':[7,8,9]})
print (df1)
B C employee_id
0 NaN 7 1
1 5.0 8 2
2 6.0 9 3
df3 = pd.merge(df1,df2, on='employee_id', how='right', indicator=True)
mask = df3['_merge'] == 'right_only'
df3.loc[mask, df1.columns.difference(['employee_id'])] =
df3.loc[mask,df1.columns.difference(['employee_id'])].fillna('not_found')
df3 = df3.drop('_merge', axis=1)
print (df3)
B C employee_id D E
0 NaN 7 1 4 7
1 not_found not_found 4 5 8
2 not_found not_found 6 6 9
df3 = pd.merge(df1,df2, on='employee_id', how='right')
mask = ~df2['employee_id'].isin(df1['employee_id'])
df3.loc[mask, df1.columns.difference(['employee_id'])] = \
df3.loc[mask,df1.columns.difference(['employee_id'])].fillna('not_found')
print (df3)
B C employee_id D E
0 NaN 7 1 4 7
1 not_found not_found 4 5 8
2 not_found not_found 6 6 9
关于Python Pandas - 找不到匹配项时返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43309034/