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



我有两个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

我正在寻找一种通过熊猫,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

输出

numberstyle="文本对齐:右;">0style="文本对齐:右;">1style="文本对齐:右;">2style="文本对齐:右;">3style="text-align: right;">4
Titleglide gscoreIFDScoreIDsmiles
2860436128604361NC(=O)CNC(=O)CC(c(cc1)cc(c12)OCO2)c3ccccc3102
14492699-9.01-1020.1814492699COc1cccc(c1OC)C(=O)N2CCCC(C2)CCC(=O)Nc3ccc(F)cc3C235
14492699-8.759-1020.0114492699COc1cccc(c1OC)C(=O)N2CCCC(C2)CCC(=O)Nc3ccc(F)cc3C235
14492699-7.301-1019.2814492699COc1cccc(c1OC)C(=O)N2CCCC(C2)CCC(=O)Nc3ccc(F)cc3C235
16888863nannan16888863COc1cc(ccc1O)CN2CCN(CC=C(C)C)C(C2)CCO108

相关内容

  • 没有找到相关文章

最新更新