求助:DataFrame.loc语句部分返回0异常,需按Loop列匹配Call列值
Pandas按Loop列值获取Call列首次出现值异常修复
需求与问题
需要根据DataFrame的Loop列值,获取Call列对应值的首次出现。现有代码在前19行(索引0至18)运行正常,之后开始返回0。程序用于G代码转SVG,结构为串行编写,仅需修复目标语句,无需重写整体。已确认Active_Loop为正确整数1,转字符串前数据无误,DataFrame内值也正确,语句无语法错误。
问题代码
Current_Call = Loop_Data_Frame.loc[Loop_Data_Frame["Loop"].str.contains(str(Active_Loop), na=False), "Call"].values[1]
对应DataFrame数据
Loop data frame Line 1177 - Loop_Data_Frame: Loop Call Line Text 0 0 0 0 2660 G83 X-46 Y+0 Z+0 1 0 0 0 2661 G83 X-46 Y+0 Z+0 2 60 0 1 27 G01 G90 X+63.45 Y-18.45 F9998 M13 3 60 0 2 28 G83 P01 -2 P02 -10.1 P03 -10 P04 0 P05 571 4 60 0 3 29 G79 5 60 0 4 30 G56 G91 X+46 Y+0 Z+0 6 60 0 5 31 G98 L0 7 61 0 1 42 G01 G91 Z-3.5 F499 8 61 0 2 43 G01 G90 X+136.5 9 61 0 3 44 G98 L62 10 62 0 1 45 G01 G90 Y-60.5 11 62 0 2 46 G01 G91 X-46 12 62 0 3 47 G01 G90 Y+0.5 13 62 0 4 48 G98 L0 14 62 0 1 50 G01 G90 X-7 15 62 0 2 51 G98 L0 16 63 0 1 57 G01 G90 X+63.45 Y-18.45 M13 17 63 0 2 58 G01 G90 Z-1 F499 18 63 0 3 59 G98 L1 19 1 0 1 60 G07 G91 Z-4.9 F250 20 1 0 2 61 G07 G91 Z+10.3 F9998 21 1 0 3 62 G07 G91 Z-10.3 F1000 22 1 0 4 63 G01 G90 Y-41.55 F499 23 1 0 5 64 G01 G90 X+71.55 24 1 0 6 65 G01 G90 Y-18.45 25 1 0 7 66 G01 G90 X+63.45 26 1 0 8 67 G98 L0
问题原因
- 字符串匹配误判:
str.contains(str(Active_Loop))会匹配所有包含目标数字的字符串,比如Active_Loop=1时,Loop=61、62、63都会被误匹配(这些值的字符串形式包含"1")。 - 硬取索引错误:
.values[1]固定取第二个匹配元素,而不是首次出现的对应Loop值的元素,导致取到的是前面误匹配行的Call值(均为0)。
修复方案
将字符串模糊匹配改为数值精确匹配,同时取首次出现的元素:
Current_Call = Loop_Data_Frame.loc[Loop_Data_Frame["Loop"] == Active_Loop, "Call"].iloc[0]
Loop == Active_Loop:精确匹配Loop列的数值,避免模糊匹配的误判.iloc[0]:取匹配结果中的第一个元素,即Call列的首次出现值,比.values[0]更安全(无匹配项时会抛出明确异常,便于调试)
可选容错处理
如果需要处理无匹配项的情况,可添加默认值:
match_rows = Loop_Data_Frame[Loop_Data_Frame["Loop"] == Active_Loop] Current_Call = match_rows["Call"].iloc[0] if not match_rows.empty else 0
内容的提问来源于stack exchange,提问作者barleybill
相关产品推荐
相关产品推荐

