首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大熊猫群按条件计数

大熊猫群按条件计数
EN

Stack Overflow用户
提问于 2018-06-28 02:22:41
回答 2查看 1.1K关注 0票数 2

示例数据

鉴于以下数据框架:

代码语言:javascript
复制
| feature | gene  |  target  | pos | 
| 1_1_1   | NRAS  |  AATTGG  | 60  |
| 1_1_1   | NRAS  |  TTGGCC  | 6   |
| 1_1_1   | NRAS  |  AATTGG  | 20  |
| 1_1_1   | KRAS  |  GGGGTT  |  0  |
| 1_1_1   | KRAS  |  GGGGTT  |  0  |
| 1_1_1   | KRAS  |  GGGGTT  |  0  |
| 1_1_2   | NRAS  |  CCTTAA  | 2   |
| 1_1_2   | NRAS  |  GGAATT  | 8   |
| 1_1_2   | NRAS  |  AATTGG  | 60  |

问题所在

对于每个特性,我想计算每个基因中有多少个目标,并遵循以下规则:

  • 如果一个目标只出现在每一个基因的一个位置(pos列),那么每次看到它它都会得到1的计数。
  • 如果同一目标出现在每个基因的多个位置上,它就会得到一个计数(在找到的位置/总位置上计数)。
  • 汇总每个特征的每个基因的总数

我至今所做的一切

代码语言:javascript
复制
matches.groupby(["FeatureID", "gene"]).size().reset_index()

matches['multi_mapped'] = np.where(matches.groupby(["FeatureID", "gene", "target"]).pos.transform('nunique') > 1, "T", '')

这给了我一个数据,其中出现在多个位置的目标被标记为真。现在我只需要弄清楚如何使计数正常化。

期望输出

代码语言:javascript
复制
| feature | gene  |  count
| 1_1_1   | NRAS  |   2
| 1_1_1   | KRAS  |   1
| 1_1_2   | NRAS  |   3

因此,在上面的1_1_1 NRAS示例中,AATTGG位于60和20位置,每个位置都将得到一个.5计数。因为TTGGCC只在一个位置找到一次,所以它的计数为1,这就使得总计数为2。

如果在相同的位置上找到了3次1_1_1 NRAS TTGGCC,那么每一次都会得到1的计数,总共3+ .5 + .5 = 4。

解决方案需要检查相同的目标出现在不同的位置,然后相应地调整计数,这是我遇到困难的部分。我的最终目标是选择每组计数最高的基因。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-02 18:09:37

好吧,我想出来了。如果有更有效的方法来做这件事,我会全神贯注的!

代码语言:javascript
复制
    # flag targets that are multi-mapped and add flag as new column
    matches['multi_mapped'] = np.where(matches.groupby(["FeatureID", "gene", "target"]).pos.transform('nunique') > 1, "T", '')

    # separate multi and non multi mapped reads using flag
    non = matches[matches["multi_mapped"] != "T"]\
        .drop("multi_mapped", axis=1)
    multi = matches[matches["multi_mapped"] == "T"]\
        .drop("multi_mapped", axis=1)

    # add counts to non multi mapped reads
    non = non.groupby(["FeatureID", "gene", "target"])\
        .count().reset_index().rename(columns={"pos":"count"})

    # add counts to multi-mapped reads with normaliztion 
    multi["count"] = multi.groupby(["FeatureID", "gene", "target"])\
          .transform(lambda x: 1/x.count())
    multi.drop("pos", axis=1, inplace=True)

    # join the multi and non back together
    counts = pd.concat([multi, non], axis=0)
票数 0
EN

Stack Overflow用户

发布于 2018-06-28 04:12:59

我不太清楚为什么第一排的计数应该是2。你能试着玩这个游戏吗:

代码语言:javascript
复制
import pandas as pd
feature = ["1_1_1"]*6 +["1_1_2"]*3
gene = ["NRAS"]*3+["KRAS"]*3+["NRAS"]*3
target = ["AATTGG","TTGGCC", "AATTGG"]+ ["GGGGTT"]*3 + ["CCTTAA", "GGGGTT", "AATTGG"]
pos = [60,6,20,0,0,0,2,8,60]
df = pd.DataFrame({"feature":feature,
                   "gene":gene,
                   "target":target,
                   "pos":pos})

df.groupby(["feature", "gene"])\
  .apply(lambda x:len(x.drop_duplicates(["target", "pos"])))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51073813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档