【问题标题】:Add list to Excel column将列表添加到 Excel 列
【发布时间】:2016-02-04 00:29:48
【问题描述】:

我有两个文件:

  • 1 个文件是包含序列名称及其序列的 fasta 文件。
  • 另一个文件是一个excel文件,它有一个'Hcolumn'的序列名称和一个空列,标题为'Hsequence'和一个'Kcolumn'的序列名称,它旁边有一个空列,带有标头“Ksequence”。

我想循环遍历这两个文件,如果fasta文件中的序列名称也在'Hcolumn'或'Kcolumn'中,则将该序列添加到excel文件中的相应序列列中,即“Hsequence”或“Ksequence”列。 我的想法是获取 vh 值的位置,并将其 seq 值添加到其右侧(下一行)的单元格中。

更新示例

fasta 文件(忽略 > 符号):

headerA
AAAGGCCT
headerB
ATCCTTTG
headerC
GGGGTCCCAAT

excel表格

Hcolumn   Hsequence     Kcolumn    Ksequence 
headerA                 headerB
headerC                 headerE
headerD                 headerF

期望的结果:

Hcolumn   Hsequence     Kcolumn    Ksequence 
headerA   AAAGGCCT      headerB    ATCCTTTG
headerC   GGGGTCCCAAT   headerE
headerD                 headerF

我的新代码:(我下面的代码只处理一列,我还不知道它是在列A还是在B列)

for line in f:         
    seq = f.readline()
    for vh in data["Hcolumn"]:
        vh = vh.rstrip()
        if (title in vh): 
            #print(">"+title, seq)
            data["HSequence"]=data["Hcolumn"].apply(lambda vh: seq)

        else:
            data["HSequence"]=data["Hcolumn"].apply(lambda vh: '')
            break               
return data.to_csv('Fullseqfile.txt', sep='\t')

序列列返回null,有人可以帮忙吗 谢谢

【问题讨论】:

  • 什么是数据,.apply() 有什么作用?
  • @jcfollower 数据是 excel 表。使用 .appy() 我想说文件中的标题是否在 Hcolumn 中,然后将文件中的下一行添加到 Hsequence 列
  • .apply(lambda vh: seq) 让我很困惑。我的理解是 lambda 应该看起来像这样......lambda x: 2*x,这意味着“取 x 并返回它的双精度数”。无论输入是什么,看起来您的 lambda 表达式分别返回 seq''
  • @jcfollower 那么我应该如何编写它以便当“Hcolumn”包含来自 fasta 文件的标题时程序将 seq 提供给“Hsequence”列?谢谢!
  • 你用什么库来做excel。文件顶部是否有import 声明?

标签: python excel loops pandas fasta


【解决方案1】:
In [1]: import pandas as pd

In [2]: !cat data/question1/file.fasta
headerA
AAAGGCCT
headerB
ATCCTTTG
headerC
GGGGTCCCAAT

In [3]: xls=pd.read_excel('file.xls')

In [4]: xls
Out[4]: 
   Hcolumn  Hsequence  Kcolumn  Ksequence
0  headerA        NaN  headerB        NaN
1  headerC        NaN  headerE        NaN
2  headerD        NaN  headerF        NaN

In [5]: fh = open('file.fasta')
   ...: fasta_dic={}
   ...: for line in fh:
   ...:     if line.startswith('h'):
   ...:         seq_header = line.strip('\n')
   ...:         fasta_dic[seq_header] = ''
   ...:     else:
   ...:         fasta_dic[seq_header] = line.strip('\n')
   ...:         

In [6]: def fill_seq(x):
   ...:     if x in fasta_dic.keys():
   ...:         return fasta_dic[x]
   ...:     else:
   ...:         return ''
   ...:     

In [7]: xls['Hsequence'] = xls['Hcolumn'].apply(fill_seq)
   ...: xls['Ksequence'] = xls['Kcolumn'].apply(fill_seq)
   ...: 

In [8]: xls
Out[8]: 
   Hcolumn    Hsequence  Kcolumn Ksequence
0  headerA     AAAGGCCT  headerB  ATCCTTTG
1  headerC  GGGGTCCCAAT  headerE          
2  headerD               headerF 
  1. 构建字典fasta_dic,其中序列名称为键,序列为值。

  2. 函数fill_seq检查输入x是否在您之前定义的字典中,如果找到值,它将返回序列。

  3. 您将函数 fill_seq 应用到 H/K 序列列,使用 H/K 序列中的值作为输入。

在此之后,您可以继续使用您的数据框或将其导出到 xls 文件。

【讨论】:

    【解决方案2】:

    这是给你一些想法的快速尝试......

    FASTA = [
        'headerA',
        'AAAGGCCT',
        'headerB',
        'ATCCTTTG',
        'headerC',
        'GGGGTCCCAAT',
    ]
    
    
    EXCEL = {
        'Hcolumn': ['headerA', 'headerC', 'headerD'],
        'Hsequence': {},
        'Kcolumn': ['headerB', 'headerE', 'headerF'],
        'Ksequence': {},
    }
    
    for index in range(0, len(FASTA), 2):
        value = FASTA[index]
        column = EXCEL['Hcolumn']
        # print index, value, column
        if value in EXCEL['Hcolumn']:
            position = column.index(value)
            EXCEL['Hsequence'][position] = FASTA[index+1]
    
    for item in EXCEL.iteritems():
        print item
    
    ========================
    
    ('Hcolumn', ['headerA', 'headerC', 'headerD'])
    ('Kcolumn', ['headerB', 'headerE', 'headerF'])
    ('Hsequence', {0: 'AAAGGCCT', 1: 'GGGGTCCCAAT'})
    ('Ksequence', {})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-02
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      相关资源
      最近更新 更多