如何从python中的字符索引中找到行号?

Posted

技术标签:

【中文标题】如何从python中的字符索引中找到行号?【英文标题】:How to find the row number from a character index in python? 【发布时间】:2021-01-24 11:18:39 【问题描述】:

我有一个基因数据集,其中行的索引是基因的名称。我还希望找到任何给定基因的行号,以便在基因通过机器学习模型预测后单独查看基因 - 以解释基因的预测。我如何为 shap 图编码目前需要一个行号来提取特定基因。

我的数据如下所示:

Index   Feature1  Feature2   ... FeatureN
Gene1     1           0.2          10
Gene2     1           0.1          7
Gene3     0           0.3          10

例如,如果我想拉出并查看 Gene3 的模型预测,我这样做:

import shap
shap.initjs()

xgbr = xgboost.XGBRegressor()

def shap_plot(j):
    explainerModel = shap.TreeExplainer(xgbr)
    shap_values_Model = explainerModel.shap_values(X_train)
    p = shap.force_plot(explainerModel.expected_value, shap_values_Model[j], X_train.iloc[[j]],feature_names=df.columns)
    return(p)

shap_plot(3)

shap_plot(3) 对我来说是个问题,因为我实际上不知道我想要的基因是否在打乱的训练或测试数据的第 3 行。

有没有办法从已知的基因索引中提取行号?或者可能重新编码我的 shap 图,以便它接受我的字符串索引?我有生物学背景,因此不胜感激。

【问题讨论】:

基因是 df 的实际索引还是在名为 "Index" 的列中? 它们是实际的索引 【参考方案1】:

有很多方法可以获取与索引值或列值关联的行号。

例如,如果您的基因实际上位于名为"Index" 的列中,您可以这样做:

x_train[x_train["Index"] == "gene3"].index + 1

如果没有,您可以随时通过在数据帧上调用 reset_index() 来解决此问题。

另一种选择是在数据框中创建一个新列,例如从 1 到 n

mapping = x_train.assign(index_number=range(x_train.shape[0]))["index_number"]

现在mapping 应该是这样的:

Index   index_mapping 
Gene1     0           
Gene2     1           
Gene3     2           

调用mapping["Gene2"] 应该返回1

除此之外,我注意到您正在使用力图。我建议您阅读this article,了解为什么 shap 将它们替换为决策图。

另外,每次调用函数时,你都在重新构建树解释器。这非常低效,为什么不构建一次,然后多次查询:

class ShapPlotter:
    def __init__(self, model, x_train):
        self.explainer_model = shap.TreeExplainer(model)
        self.shap_values_Model = self.explainer_model.shap_values(x_train)
        self.gene_index_mapping = x_train.assign(index_value=range(x_train.shape[0]))["index_value"]

    def plot(gene):
        idx = self._get_index(gene)
        shap_plot = shap.force_plot(...) # replace j with idx here
        return shap_plot

    def _get_index(gene: str) -> int:
        # your choice of method here. e.g. https://***.com/a/64279019/1011724
        # in this case, I built a mapping series in the __init__ fn so you can get the index number by just indexing directly with the gene string: 
        return self.gene_index_mapping.loc[gene]

【讨论】:

【参考方案2】:
list(df[df.Index=='Gene3'].index)

【讨论】:

【参考方案3】:

试试下面的。 df 是您的数据框,结果将为您提供给定基因的行号(第一行将产生 1 等)

list(df.index).index('Gene3')+1

#result

3

【讨论】:

以上是关于如何从python中的字符索引中找到行号?的主要内容,如果未能解决你的问题,请参考以下文章

如何从python中的字符串创建日期时间索引?

如何在多个文件中搜索字符串并在 Excel 或 Powershell 中的 csv 中返回带有行号/文本的文件名

如何从 SQL Server 中的表中获取行的索引?

字符串入门十八讲合集四

字符串入门十八讲合集四

如何在python列表中查找某个元素的索引