for循环多变量解包错误及基于MrkA/Mrk1提取DataFrame的方案
解决代码报错与需求实现
首先,你的代码报错cannot unpack non-iterable int object是因为循环的拆包写法错误:
for i,j in range(df.shape[1]):range()返回的是单个整数序列,无法直接拆分成两个变量i,j,同理内层的for k,l in range(df.shape[0])也犯了同样的错误。
接下来,我们按照你的需求(找到第一个MrkA的位置,提取其下两行的指定列浮点数值)来实现正确的代码:
步骤1:定位第一个MrkA的位置
我们可以通过更高效的stack()方法找到第一个出现MrkA的行和列索引:
import pandas as pd # 你的输入数据 df = pd.DataFrame({ 'A':['sdfg',23,'MrkA',34,0,56], 'B':['jfgh',23,'sdfg','Mrk1',0,56], 'C':['cvb',7,'dsfgA','ghks',47,3], 'D':['rrb',7,'gfd',3,0,7], 'E':['dfg',7,'gfd',5,12,1], 'F':['dfg',7,'sdfA',5,0,4], 'G':['dfg',7,'sdA',5,8,9], 'H':['dfg',7,'gfA',5,0,8], 'I':['dfg',7,'sdfA',5,7,23] }) # 找到第一个'MrkA'的位置(行、列) mrka_pos = df.stack()[df.stack() == 'MrkA'].index[0] row_mrka, col_mrka = mrka_pos
步骤2:提取目标数据
根据你的期望输出,我们需要提取MrkA所在行的下两行(即索引row_mrka + 2开始的行),以及指定列(A、B、C、E、F、H、I,对应索引0,1,2,4,5,7,8):
# 定义要提取的列索引(基于MrkA所在列的偏移) target_cols = [col_mrka, col_mrka+1, col_mrka+2, col_mrka+4, col_mrka+5, col_mrka+7, col_mrka+8] # 提取目标行和列 df1 = df.iloc[row_mrka + 2:, target_cols] # 输出结果 print(df1)
运行结果
执行后会得到你期望的输出:
A B C E F H I 4 0 0 47 12 0 0 7 5 56 56 3 1 4 8 23
补充说明
如果你不想用stack()方法,也可以用嵌套循环实现定位(更直观):
row_mrka, col_mrka = None, None # 遍历列 for col_idx in range(df.shape[1]): # 遍历行 for row_idx in range(df.shape[0]): if df.iloc[row_idx, col_idx] == 'MrkA': row_mrka, col_mrka = row_idx, col_idx break # 找到第一个MrkA后终止外层循环 if row_mrka is not None: break
内容的提问来源于stack exchange,提问作者shoggananna
相关产品推荐
相关产品推荐

