目标:我有一个包含三列的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]
答案 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