在一个 csv 中查找字符串并在循环中用另一个 csv 中的字符串替换

Find string in one csv and replace with string in a different csv in a loop

我有两个 csv 文件。 csv1 看起来像这样:

Title,glide gscore,IFDScore
235,-9.01,-1020.18
235,-8.759,-1020.01
235,-7.301,-1019.28

csv2 看起来像这样:

ID,smiles,number
28604361,NC(=O)CNC(=O)CC(c(cc1)cc(c12)OCO2)c3ccccc3,102
14492699,COc1cccc(c1OC)C(=O)N2CCCC(C2)CCC(=O)Nc3ccc(F)cc3C,235
16888863,COc1cc(ccc1O)CN2CCN(CC=C(C)C)C(C2)CCO,108

两者都比我在这里展示的要大得多。我需要一些方法来将 csv1Title 列中的每个值与 csv2number 列中的相应值相匹配。找到匹配后,我需要将 csv1Title 列中的值替换为 csv2ID 列中的相应值。因此我希望我想要的输出是:

Title,glide gscore,IFDScore
14492699,-9.01,-1020.18
14492699,-8.759,-1020.01
14492699,-7.301,-1019.28

我正在寻找通过 pandas、bash 或 python 实现的方法。

我没有粘贴我尝试过的确切代码,因为如果同时在 pandas、bash 和 python 中看到错误代码,那会让人不知所措。

你可以使用pandas模块来加载你的dataframe,然后,使用merge函数,你就可以实现你想要的:

import pandas as pd
df1 = pd.read_csv("df1.csv")
df2 = pd.read_csv("df2.csv")

merged = df1.merge(df2, left_on="Title", right_on="number", how="right")
merged["Title"] = merged["ID"]
merged

输出

Title glide gscore IFDScore ID smiles number
0 28604361 nan nan 28604361 NC(=O)CNC(=O)CC(c(cc1)cc(c12)OCO2)c3ccccc3 102
1 14492699 -9.01 -1020.18 14492699 COc1cccc(c1OC)C(=O)N2CCCC(C2)CCC(=O)Nc3ccc(F)cc3C 235
2 14492699 -8.759 -1020.01 14492699 COc1cccc(c1OC)C(=O)N2CCCC(C2)CCC(=O)Nc3ccc(F)cc3C 235
3 14492699 -7.301 -1019.28 14492699 COc1cccc(c1OC)C(=O)N2CCCC(C2)CCC(=O)Nc3ccc(F)cc3C 235
4 16888863 nan nan 16888863 COc1cc(ccc1O)CN2CCN(CC=C(C)C)C(C2)CCO 108

请注意,Nan 值是由于值不可用所致。如果您的数据框也包含这些部分,则不会导致 Nan.

你可以map它;然后使用 fillna 以防有任何“标题”没有匹配的“数字”:

csv1 = pd.read_csv('first_csv.csv')
csv2 = pd.read_csv('second_csv.csv')
csv1['Title'] = csv1['Title'].map(csv2.set_index('number')['ID']).fillna(csv1['Title']).astype(int)

输出:

      Title  glide gscore  IFDScore
0  14492699        -9.010  -1020.18
1  14492699        -8.759  -1020.01
2  14492699        -7.301  -1019.28