【发布时间】:2025-12-19 21:15:12
【问题描述】:
我想以类似于previous question 的方式计算每个元素(一个字符)在每个位置出现的频率。这是我目前的解决方案:
import pandas as pd
sequences = ['AATC',
'GCCT',
'ATCA',
'TGAG',
'CGGA']
f = zip(*sequences)
counts = [{letter: column.count(letter) for letter in column} for column in f]
counts=pd.DataFrame(counts).transpose()
print counts
0 1 2 3
A 2 1 1 2
C 1 1 2 1
G 1 2 1 1
T 1 1 1 1
(熊猫在那里,因为它是我的首选输出)。但是,由于我正在处理数十万甚至数百万个序列(长度为 10 个字符或更多),所以这有点慢:大约 100^3 个序列需要 20 分钟,而在我的真实数据集中需要几个小时。所以我想我可以通过使用 pandas 来提高速度,因为无论如何我都在转换为数据框:df = pd.DataFrame(f).transpose()。
结果证明这个策略更慢:
解决方案 1
import time
start_time = time.time()
counts = [{letter: column.count(letter) for letter in column} for column in f]
counts=pd.DataFrame(counts).transpose()
print(counts)
print("--- %s seconds ---" % (time.time() - start_time))
--- 0.00820517539978 seconds ---
解决方案 2
start_time = time.time()
df = pd.DataFrame(f).transpose()
print df.apply(lambda col: col.value_counts())
print("--- %s seconds ---" % (time.time() - start_time))
--- 0.0104739665985 seconds ---
所以问题是:有没有办法优化它?我研究了df.apply(lambda col: col.value_counts()) 的多处理,但似乎很容易实现。
【问题讨论】:
-
相关*.com/questions/22104338/…,使用频率Trie,应该是高效的
标签: python performance pandas