我有两个带有数据的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”。
有什么办法吗?
3条答案
按热度按时间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
ldxq2e6h2#
merge
带指示器: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
df3['match'] = df3['match'].map({'both': 1, 'left_only': ''})
```
df3
:还是没有
merge
通过np.where
及isin
: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
ux6nzvsh3#
你可以用
.isin()
: