合并两个csv文件,为所有匹配的记录添加带有标志值的列

bn31dyow  于 2021-08-25  发布在  Java
关注(0)|答案(3)|浏览(381)

我有两个带有数据的csv文件,我想匹配它们,并在匹配时添加一个包含标志值的列。第一个文件是包含所有患者的“主”文件,第二个文件包含已签名的文档ID。
文件1的内容:

recid  visit   docid
1      arm1    1012
2      arm1    1023
3      arm1    1024
4      arm1    1026
5      arm1    1028
6      arm1    1031
7      arm1    1037
8      arm1    1040

文件2的内容:

docid
1023
1024
1028

所需的输出文件:

recid  visit   docid  match
1      arm1    1012   
2      arm1    1023   1
3      arm1    1024   1
4      arm1    1026
5      arm1    1028   1
6      arm1    1031
7      arm1    1037
8      arm1    1040

以下是我目前掌握的代码:

import pandas as pd

# which file to read

IN_FILE1 = "patients.txt"
IN_FILE2 = "informedconsent.txt"
OUT_FILE = "output_matched.csv"

# load data from csv files

df_file1 = pd.read_csv (IN_FILE1, sep = "\t")
df_file2 = pd.read_csv (IN_FILE2, sep = "\t")

# merge on docid

df_merge = df_file1.merge(df_file2, on='docid', how='left')

# flag the matches

if df_merge['docid'].empty:
    df_merge['matched'] = ""
else: 
    df_merge['matched'] = "1"

print(df_merge) #test

# write to file

df_merge.to_csv (OUT_FILE, sep = "\t", index = False, header=True)

问题很明显,它被合并到了 docid 列,所以它永远不会为空。但是第二个文件只包含一列,因此没有添加新列,否则我可以检查这些新列或其他内容。
如果我把它改成 how='inner' 然后它工作,但我只得到匹配项,但结果需要是第一个文件的所有记录,即使它们不匹配。
当我编辑file2并将列名更改为 docid2 并将代码更改为:

df_merge = df_file1.merge(df_file2, left_on='docid', right_on='docid2', how='left')

if df_merge['docid2'].empty:
    # etc..

它增加了一个 docid2 列,该列仅在存在匹配项时包含guid值,因此这是正确的。然而 matched 列仍然始终包含“1”。
有什么办法吗?

yzuktlbb

yzuktlbb1#

使用 isin + astype + replace ```
df_parent['match'] = df_parent['docid'].isin(df_docid['docid']).astype(int).replace(0, '')

输出:

recid visit docid match
0 1 arm1 1012
1 2 arm1 1023 1
2 3 arm1 1024 1
3 4 arm1 1026
4 5 arm1 1028 1
5 6 arm1 1031
6 7 arm1 1037
7 8 arm1 1040

ldxq2e6h

ldxq2e6h2#

merge 带指示器:

df3 = df1.merge(df2, on='docid', how='left', indicator='match')
``` `df3` :

recid visit docid match
0 1 arm1 1012 left_only
1 2 arm1 1023 both
2 3 arm1 1024 both
3 4 arm1 1026 left_only
4 5 arm1 1028 both
5 6 arm1 1031 left_only
6 7 arm1 1037 left_only
7 8 arm1 1040 left_only

然后 `map` 要转换值,请执行以下操作:

df3['match'] = df3['match'].map({'both': 1, 'left_only': ''})
``` df3 :

recid visit  docid match
0      1  arm1   1012      
1      2  arm1   1023     1
2      3  arm1   1024     1
3      4  arm1   1026      
4      5  arm1   1028     1
5      6  arm1   1031      
6      7  arm1   1037      
7      8  arm1   1040

还是没有 merge 通过 np.whereisin :

df1['match'] = np.where(df1['docid'].isin(df2['docid']), 1, '')
``` `df1` :

recid visit docid match
0 1 arm1 1012
1 2 arm1 1023 1
2 3 arm1 1024 1
3 4 arm1 1026
4 5 arm1 1028 1
5 6 arm1 1031
6 7 arm1 1037
7 8 arm1 1040

ux6nzvsh

ux6nzvsh3#

你可以用 .isin() :

df_file1['match'] = (df_file1['docid'].isin(df_file2['docid'])*1).replace(0,'')

print(df_file1)

   recid visit  docid match
0      1  arm1   1012      
1      2  arm1   1023     1
2      3  arm1   1024     1
3      4  arm1   1026      
4      5  arm1   1028     1
5      6  arm1   1031      
6      7  arm1   1037      
7      8  arm1   1040

相关问题