我有两个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
两者都比我在这里展示的要大得多。我需要某种方法将csv1
Title
列中的每个值与csv2
number
列中的相应值相匹配。找到匹配项后,我需要将csv1
Title
列中的值替换为csv2
ID
列中的相应值。因此,我希望我想要的输出是:
Title,glide gscore,IFDScore
14492699,-9.01,-1020.18
14492699,-8.759,-1020.01
14492699,-7.301,-1019.28
我正在寻找一种通过熊猫,bash或python来做到这一点的方法。
这个答案很接近,但给了我一个模糊的数据帧真值。
我也尝试过
update
熊猫,但没有运气。
我还没有粘贴我尝试过的确切代码,因为同时在 pandas、bash 和 python 中看到错误的代码会让人不知所措。
你可以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
您可以使用pandas
模块加载数据帧,然后使用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 |
---|
28604361 | 南 | 南 | 28604361 | NC(=O)CNC(=O)CC(c(cc1)cc(c12)OCO2)c3ccccc3 | 102 |
14492699 | -9.01 | -1020.18 | 14492699 | COc1cccc(c1OC)C(=O)N2CCCC(C2)CCC(=O)Nc3ccc(F)cc3C | 235 |
14492699 | -8.759 | -1020.01 | 14492699 | COc1cccc(c1OC)C(=O)N2CCCC(C2)CCC(=O)Nc3ccc(F)cc3C | 235 |
14492699 | -7.301 | -1019.28 | 14492699 | COc1cccc(c1OC)C(=O)N2CCCC(C2)CCC(=O)Nc3ccc(F)cc3C | 235 |
16888863 | nan | nan | 16888863 | COc1cc(ccc1O)CN2CCN(CC=C(C)C)C(C2)CCO | 108 |