【发布时间】:2018-11-18 23:51:49
【问题描述】:
假设我有以下两个数据框。
实际上,两个数据帧每个大约有一百万行,所以我想找到最有效的比较方法:
- 每个 df2["BaseCall"] 与每个 df1["seq"]
- 返回一个数据框,其中包含每个 df1["gene"] 上的位置列表 在哪里找到任何 df2["BaseCall"]
总体目标是统计每个feature_id在基因中出现的次数,并捕获位置信息以供下游使用。
# break fasta_df sequences and mutation seqs up into kmers
data = [{"gene":"pik3ca", "start":"179148724", "stop":"179148949","seq":"TTTGCTTTATCTTTTGTTTTTGCTTTAGCTGAAGTATTTTAAAGTCAGTTACAG"},
{"gene":"brca1", "start":"179148724", "stop":"179148949","seq":"CAATATCTACCATTTGTTAACTTTGTTCTATTATCATAACTACCAAAATTAACAGA"},
{"gene":"kras1", "start":"179148724", "stop":"179148949","seq":"AAAACCCAGTAGATTTTCAAATTTTCCCAACTCTTCCACCAATGTCTTTTTACATCT"}]
# test dataframe with input seq
df1 = pd.DataFrame(data)
data2 = [{"FeatureID":"1_1_15", "BaseCall":"TTTGTT"},
{"FeatureID":"1_1_15", "BaseCall":"AATATC"},
{"FeatureID":"1_1_16", "BaseCall":"GTTTTT"},
{"FeatureID":"1_1_16", "BaseCall":"GTTCTA"},
]
df2= pd.DataFrame(data2)
输出应该类似于:
| gene | feature_id | BaseCall | Position
| pik3ca | 1_1_15 | TTTGTT | 12
| pik3ca | 1_1_16 | GTTTTT | 15
| brca1 | 1_1_16 | GTTCTA | 24
| brca1 | 1_1_15 | AATATC | 1
| brca1 | 1_1_15 | TTTGTT | 12
| brca1 | 1_1_15 | TTTGTT | 21
当我在一个 seq 上只使用一个测试碱基调用时,这个 ngram 函数似乎工作得很好,但是我无法找出最有效的方法来使用来自两个不同数据帧的一个参数的 apply 方法。或者也许有更好的方法来查找两个数据帧之间的匹配字符串/位置?
def ngrams(string, target):
ngrams = zip(*[string[i:] for i in range(6)])
output = [''.join(ngram)for ngram in ngrams]
indices = [(i,x) for i, x in enumerate(output) if x == target]
return indices
【问题讨论】:
-
问题:我看不出将数据存储在 dataframe2 中的意义。这不应该只是一个简单的字典,其中键是 BaseCall,值是 FeatureID?类似
s = pd.Series({item['BaseCall']: item['FeatureID'] for item in data2}) -
(1)
Position在您的输出中是如何计算的?你能举一个具体的例子吗? (2)这是您完整的预期输出吗?似乎还有其他匹配项。 (3) 是Basecall或BaseCall,还是您的数据中实际上有这两种拼写? -
Df2 是通过长管道中的许多其他步骤创建的。如果这样更有效,我不反对其他数据结构。
-
安德鲁,位置当前已提交 l 使用 ngrams 函数最后一行显示的枚举函数计算返回字符串的位置,然后我可以从 df1.start 中减去。
-
是的,这不是一个完整的输出。我不确定额外的信息是否有帮助,我会更新它。
标签: python pandas dataframe string-matching n-gram