给定字符串列表,请在特定列中搜索匹配的字符串并返回索引值

时间:2020-07-31 05:21:02

标签: python excel pandas

目标:我有一个包含三列的Excel工作表。 “ BigList”包含约1000个基因。具有数字基因表达值的“表达”。 “ SmallList”包含我感兴趣的约10个基因的小列表。

对于“ SmallList”中的每个基因,我想在BigList中搜索其索引并使用该索引来检索表达值。

这是我到目前为止尝试过的。我用熊猫来读取我的Excel文件。

import pandas as pd

df = pd.read_excel (r'C:\Users\Me\Box\Excel.xlsx', 
                    sheet_name='Genes')

然后,我将基因“ SmallList”的小列表保存到没有NA值的新变量中。

SmallList = df["SmallList"].dropna().tolist()

当我尝试使用这段代码时,我收到以下错误消息

df.loc[df['BigList'] == SmallList[1].index[0]

IndexError: index 0 is out of bounds for axis 0 with size 0

如果我使用SmallList [0],代码将返回索引。但是高于0给我上面的错误。我要疯了,想找出答案。

我尝试手动输入“ SmallList”

SmallList = ["GeneA", "GeneB", "GeneC"]

,我能够避免该错误。我得到了SmallList [1]和SmallList [2]的索引。我不明白为什么会这样?我希望有人可以向我解释。

使用手动创建的SmallList,我可以按照自己的方式获取索引列表。

indices = []
for i in range(0, len(SmallList)):
    indices += df.index[df['BigList'] == SmallList[i].tolist()

indices
[315, 148, 165]

1 个答案:

答案 0 :(得分:0)

这是一个解决方案(如果我正确理解了目标)。首先,创建测试数据:

import pandas as pd

big = pd.DataFrame({
    'gene': ['GeneA', 'GeneB', 'GeneC', 'GeneD', 'GeneE', ],
    'expression': ['exp-A', 'exp-B', 'exp-C', 'exp-D', 'exp-E', ]})

small = pd.DataFrame({
    'gene': ['GeneA', 'GeneC', 'GeneE'],})

第二,执行左联接(将所有项保留在小列表中,并从大列表中提取具有匹配基因的项。请注意,big.reset_index()会将big索引值放入结果集。

result = (pd.merge(left=small, 
                   right=big.reset_index(), 
                   on='gene', 
                   how='left')
            .rename(columns={'index': 'big_list_index'})
)
print(result)

    gene  big_list_index expression
0  GeneA               0      exp-A
1  GeneC               2      exp-C
2  GeneE               4      exp-E