我有一个称为df1的数据帧,该数据帧是从.csv文件派生的:
ssAA_change gx swiss_prot nx_ID prob
V25R A1BG P065E7 44564 No
L343P PP46 YTE674 76343 Yes
A2X 3DDDE QJ9Q776 87436 No
R234P FD6 LLQJU6 77678 No
C2343D CV88D YTE674 63543 Yes
第二个数据帧称为df2:
Files swiss_prot
LLQJU6_PQWYHT.csv LLQJU6
XVCF5_I9876-1.csv XVCF5
YTE674_P987G.csv YTE674
P065E7-3_J45633.csv P065E7
QJ9Q776_45FDE.csv QJ9Q776
LLQJU6_DF453.csv LLQJU6
YTE674_HDGFY.csv YTE674
我一直在尝试从df2中获取swiss_prot值,看看它是否出现在df1的swiss_prot列中。通常,该值会在df1中出现多次。
如果确实如此,那么我想在df2中搜索文件,该文件与用于搜索df1的原始swiss_prot值在同一行。 (换句话说,如果使用了df2的swiss_prot值LLQJU6,则将搜索文件LLQJU6_PQWYHT.csv)。我想在文件中搜索df1中出现的所有ssAA_change值(其中LLQJU6担心ssAA_change值为R234P),然后从文件中提取该行,并将该行附加到df1的相应行中。
请注意,文件位于不同的目录中,到目前为止,我的代码确实可以解决这个问题。实际上,每个数据帧中有成千上万个文件和数千行。此外,每个swiss_prot值在df1和df2中可能会出现多次(您可以在df1中看到YTE674值)。
这是我到目前为止尝试过的:
import os
from os import listdir
def read_in_file(filename):
df1 = pd.read_csv(filename, sep='\t')
return df1
def list_files_in_dir():
'''Read the lines from reference file'''
#from os import listdir()
from os.path import isfile, join
file_names = [i for i in listdir('/content/effects_data') if
isfile(join('/content/effects_data', i))]
dfx = pd.DataFrame({'Files':file_names})
return dfx
def list_swissprot_IDs():
'''Read the lines from reference file'''
from os.path import isfile, join
file_names = [i for i in listdir('/content/effects_data') if
isfile(join('/content/effects_data', i))]
x = [i.split('_', 1)[0] for i in file_names]
swiss_prot_IDs = pd.DataFrame({'Swiss_Prot':x})
return swiss_prot_IDs
def combine_ids_files():
df2 = pd.concat([list_files_in_dir(), list_swissprot_IDs()], axis = 1)
return df2
def select_instances1(filename):
for i in combine_ids_files().iloc[:,1]:
if i in read_in_file(filename).swiss_prot.values:
return read_in_file(filename)[read_in_file(filename) \
['swiss_prot'].astype(str).str.contains(i)]
def get_mut_list1(filename):
return [mut for mut in select_instances1(filename).iloc[:,0]]
def convert_csvfiles():
for i in combine_ids_files().iloc[:,0]:
name = os.path.join('effects_data/', i)
df = pd.read_csv(name, sep=';')
return df
def locate_mutation(filename):
newdf = convert_csvfiles()[convert_csvfiles()
['mutant'].str.upper().str.contains('|'.join(get_mut_list1(filename)),na=False)]
return newdf
运行select_instances1(filename)返回一个“临时”数据帧,其中包含df1中所有来自df2的swiss_prot值:
ssAA_change gx swiss_prot nx_ID prob
R3H CV65 YTE674 76342 No
L343P PP46 YTE674 76343 Yes
C2343D CV88D YTE674 63543 Yes
L768P BC65D YTE674 46374 No
我正在尝试在df2中的文件中搜索ssAA_cahnge值(R3H,L343P,C2343D,L768P),如果文件中包含这些ssAA_change值中的任何一个,则将该行附加到原始数据帧df1的相应ssAA_change处
df2中的每个.csv文件如下所示,但具有更多行:
mut pos rank score score2
P12F 12 7 3.4 3.56
R3H 3 1 5.6 5.69
L763F 763 22 1.1 1.23
所需的输出:
ssAA_change gx swiss_prot nx_ID prob mut pos rank score score2
R3H CV65 YTE674 76342 No R3H 3 1 5.6 5.69