使用pandas设置列之间关系的分数

时间:2016-06-23 19:11:02

标签: python pandas

我想找到列之间的关系并用分数创建一个新列,但我迷路了,不知道该怎么做。

以下是我正在使用的列

Yan     TNSeq   Kato    Eco-GeneOrth    Essential

accA    accA    accA        accA        accA    
accB    accB    accB        accB        accB    
accC    accC    accC        accC        accC    
accD    accD    accD        accD        accD    
aceF    acpP    acpP        alaS        aceF    
acpP    acpS    acpS        argA        acpP    
acpS    adk     adk         argB        acpS    

我想要的是在Essential和其他列之间设置分数。

像这样:

Yan     TNSeq   Kato    Eco-GeneOrth    Essential   Score

accA    accA    accA        accA        accA        4
accB    accB    accB        accB        accB        4
accC    accC    accC        accC        accC        4
accD    accD    accD        accD        accD        4
aceF    acpP    acpP        alaS        aceF        1
acpP    acpS    acpS        argA        acpP        3  
acpS    adk     adk         argB        acpS        3

为了给你一些背景知识,前四列是作者报告的必需基因,最后一列是大肠杆菌所有必需基因的列表。我想要的是知道有多少作者用完整列表报告相同的基本基因。

2 个答案:

答案 0 :(得分:0)

你可以这样做:

df['Score'] = pd.DataFrame(df, columns=['Yan', 'TNSeq', 'Kato', 'Eco-GeneOrth']).eq(df['Essential'], axis='rows').sum(axis=1)

答案 1 :(得分:0)

检查一下。如果您的数据集很大,可能会有一些性能问题,但是,由于您的数据没有按行对齐,我没有找到方法来避免检查每个Essential基因的整个数据框:

import pandas as pd
def check(ess, col):
    return any(col.str.contains(ess))
df["Score"] = pd.Series(sum(df.loc[:,"Yan":"Eco-GeneOrth"].
                            apply(lambda col: check(ess, col), axis = 0)) for ess in df.Essential)

#    Yan    TNSeq   Kato    Eco-GeneOrth    Essential   Score
# 0 accA    accA    accA    accA    accA    4
# 1 accB    accB    accB    accB    accB    4
# 2 accC    accC    accC    accC    accC    4
# 3 accD    accD    accD    accD    accD    4
# 4 aceF    acpP    acpP    alaS    aceF    1
# 5 acpP    acpS    acpS    argA    acpP    3
# 6 acpS    adk     adk     argB    acpS    3