有没有办法从多个文件中返回与两个数据帧中的条件匹配的值?

时间:2020-10-19 14:44:53

标签: python pandas

我有一个称为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

0 个答案:

没有答案