Python Pandas - 找不到匹配项时返回默认值

标签 python csv pandas

我正在将 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=Truemergeisin并通过 ~ 否定掩码:

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/

相关文章:

python - 将 PyTorch 代码移至 GPU 时处理大幅减速问题

Python 编码错误 "Non-ASCII character '\xff' .. ."allthough coding is declared as "# -*- 编码 : utf-8 -*-"while writing Hiragana

python-3.x - 为什么列类型不能像转换器设置中那样读取?

python - 打开 csv 文件时 pandas 中的日期时间转换错误

python - 使用 chunksize 选择数据但保持相同的顺序?

python - 有没有办法创建一个pandas数据帧,其行是整数,这些整数会增加直到每行达到某个值?

python - Pandas数据框,对滚动窗口中的任何列进行计算

python - 设置 Pandas 列时提高性能

python - Mongoengine-类型错误: Instantiating a document with positional arguments is not supported

google-app-engine - Golang CSV error bare "in non-quoted-field