我目前有一系列18个DataFrames(每个代表一个不同的年份),由3列和不同数量的行组成,代表氨基酸残基位置的标准化互信息分数,如:
YEAR1
Pos1 Pos2 MI_Score
40 40 1.00
40 44 0.53
40 70 0.23
44 44 1.00
44 70 0.90
...
我想迭代这个DataFrame列表,并修剪互信息分数小于0.50的行以及与自身配对的残差的互信息分数。这是我到目前为止所尝试的:
MIs = [MI_95,MI_96,MI_97,MI_98,MI_99,MI_00,MI_01,MI_02,MI_03,MI_04,MI_05,MI_06,MI_07,MI_08,MI_09,MI_10,MI_11,MI_12,MI_13]
for MI in MIs:
p = []
for q in range(0, len(MI)):
if MI[0][q] != MI[1][q]:
if MI[2][q] > 0.5:
p.append([MI[0][q],MI[1][q],MI[2][q]])
MI = pd.DataFrame(p)
然而,这只会削减MI中的第一项。有人可以帮我找到一种方法来遍历整个列表并修剪每个数据帧吗?
谢谢
答案 0 :(得分:6)
尽可能避免循环。它们比所有数据一起操作的“矢量化”方法慢得多,并且通常不易于读取。这是一种方式。
In [17]: self_paired = df['Pos1'] == df['Pos2']
In [18]: low_MI = df['MI_Score'] < 0.50
In [19]: df[~(low_MI | self_paired)]
Out[19]:
Pos1 Pos2 MI_Score
1 40 44 0.53
4 44 70 0.90
[2 rows x 3 columns]