【发布时间】:2019-03-26 23:25:15
【问题描述】:
我已经看到很多关于如何将 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}])
问题
我需要为每一行拆分 Target 列以返回一个 (position, letter, count) 的元组,其中起始位置在“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
我尝试创建一个默认字典,但它是单独附加每个元组列表,而不是对每个位置的计数求和:
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
【问题讨论】:
-
对不起,缺少很多依赖,不清楚你是如何从头到尾的。请尝试澄清您的问题。
-
我已经给出了重现问题的所有代码,包括依赖关系,并清楚地概述了我想要的输出。我希望这能让它更清楚。
-
@SummerEla 您指出的“所需输出”是否与您的示例输入相匹配?我的意思是,你想要的输出是你从数据框中得到的吗?
标签: python pandas dataframe counter defaultdict