我看到了很多有关如何将pandas数据框转换为嵌套字典的问题,但是没有一个涉及到信息聚合。 我甚至可能能够在pandas内完成我需要的操作,但是我卡住了。
输入
我有一个如下所示的数据框:
FeatureID gene Target pos bc_count
0 1_1_1 NRAS_3 TAGCAC 0 0.42
1 1_1_1 NRAS_3 TGCACA 1 1.00
2 1_1_1 NRAS_3 GCACAA 2 0.50
3 1_1_1 NRAS_3 CACAAA 3 2.00
4 1_1_1 NRAS_3 CAGAAA 3 0.42
# create df as below
import pandas as pd
df = pd.DataFrame([{"FeatureID":"1_1_1", "gene":"NRAS_3", "Target":"TAGCAC",
"pos":0, "bc_count":.42},
{"FeatureID":"1_1_1", "gene":"NRAS_3", "Target":"TGCACA", "pos":1,
"bc_count":1.00},
{"FeatureID":"1_1_1", "gene":"NRAS_3", "Target":"GCACAA", "pos":2,
"bc_count":0.50},
{"FeatureID":"1_1_1", "gene":"NRAS_3", "Target":"CACAAA", "pos":3,
"bc_count":2.00},
{"FeatureID":"1_1_1", "gene":"NRAS_3", "Target":"CAGAAA", "pos":4,
"bc_count":0.42}])
问题
我需要将每一行的目标列分解,返回一个元组 (位置,字母,计数),其中起始位置在“pos”列中给出,然后枚举每个位置的字符串,计数是在该行中“bc_count”列中找到的值。
例如,在第一行中,期望的元组列表应为:
[(0, "T", 0.42), (1,"A", 0.42), (2,"G", 0.42), (3,"C", 0.42), (4,"A", 0.42), (5,"C", 0.42)]
我尝试过的
我编写了代码,将目标列分解为找到的位置,返回该字母的位置、核苷酸(字母)和计数的元组,并将它们作为一列添加到数据帧中:
def index_target(row):
count_list = [((row.pos + x),y,
row.bc_count) for x,y in
enumerate(row.Target)]
df['pos_count'] = df.apply(self.index_target, axis=1)
该函数将基于行的目标列返回每一行的元组列表。
我需要处理df中的每一行,对于每个目标,计算其数量总和。因此,我考虑使用字典作为计数器:
position[letter] += bc_count
我尝试创建一个defaultdict,但它是将每个元组列表单独添加而不是对每个位置的计数进行求和:
from collections import defaultdict
d = defaultdict(dict) # also tried defaultdict(list) here
for x,y,z in row.pos_count:
d[x][y] += z
预期输出
对于数据框中的每个特征,下面的数字代表在bc_count列中找到的每个位置的个体计数之和,x代表发现平局的位置,无法返回任何一个字母作为最大值:
pos A T G C
0 25 80 25 57
1 32 19 100 32
2 27 18 16 27
3 90 90 90 90
4 10 42 37 18
共识= TGXXT