列表理解有效,但 for 循环无效——为啥?
Posted
技术标签:
【中文标题】列表理解有效,但 for 循环无效——为啥?【英文标题】:List comprehension works but not for loop––why?列表理解有效,但 for 循环无效——为什么? 【发布时间】:2016-12-26 22:21:03 【问题描述】:我对自己有点恼火,因为我不明白为什么一个问题的解决方案有效而另一个无效。如,它表明我对(基本)熊猫的理解不足,这让我很生气!
无论如何,我的问题很简单:我有一个“坏”值列表(“bad_index”);这些对应于我想删除相应行的数据帧('data_clean1')上的行索引。但是,由于每个新数据集的值都会发生变化,因此我不想将错误值直接插入代码中。这是我首先做的:
bad_index = [2, 7, 8, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 29]
for i in bad_index:
dataclean2 = dataclean1.drop([i]).reset_index(level = 0, drop = True)
但这没有用; data_clean2 与 data_clean1 完全相同。我的第二个想法是使用列表推导(如下);结果很好。
bad_index = [2, 7, 8, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 24, 29]
data_clean2 = data_clean1.drop([x for x in bad_index]).reset_index(level = 0, drop = True)
现在,为什么列表理解方法有效,而不是“for”循环?我已经编码了几个月,我觉得我不应该犯这些错误。
谢谢!
【问题讨论】:
我不确定drop
做了什么,但我知道在for loop
中,您在每次迭代期间都会重新分配dataclean2
。
你的意思是列表理解而不是正则表达式?就是否犯错误而言,我已经编码多年,仍然遇到我不理解的问题,并且犯了我觉得我不应该犯的错误!我希望我能告诉你,错误会随着时间的推移而消失......
是的,为清楚起见进行了编辑!
【参考方案1】:
data_clean1.drop([x for x in bad_index]).reset_index(level = 0, drop = True)
相当于简单地将bad_index
列表传递给drop
:
data_clean1.drop(bad_index).reset_index(level = 0, drop = True)
drop
接受一个列表,并删除列表中存在的每个索引。
您的显式for
循环不起作用,因为在每次迭代中,您只是从dataclean1
数据帧中删除了一个不同的索引,而没有保存中间数据帧,所以到最后一次迭代dataclean2
只是执行的结果dataclean2 = dataclean1.drop(29).reset_index(level = 0, drop = True)
【讨论】:
哦,这就是我没有完全阅读问题+1好的答案而得到的结果 很好的答案——谢谢!这很好地阐明了这一点。有趣的是,我永远不会在遍历列表时犯这个错误。但至少我不会再犯了……【参考方案2】:编辑:事实证明这不是你的问题......但如果你没有在 Deepspace 的另一个答案中提到的问题,那么你会遇到这个问题
for i in bad_index:
dataclean2 = dataclean1.drop([i]).reset_index(level = 0, drop = True)
想象你的坏索引是[1,2,3]
,你的数据清理是[4,5,6,7,8]
现在让我们逐步了解实际发生的情况
初始:dataclean == [4,5,6,7,8]
loop0 : i == 1 => 删除索引 1 ==>dataclean = [4,6,7,8]
loop1 : i == 2 => 删除索引 2 ==> dataclean = [4,6,8]
loop2 : i ==3 ==> 删除索引 3 !!!!呃哦没有索引3
我猜你可以这样做
for i in reversed(bad_index):
...
这样,如果你先删除 index3,它不会影响索引 1 和 2
但一般来说,您不应在迭代列表/字典时对其进行变异
【讨论】:
以上是关于列表理解有效,但 for 循环无效——为啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 sorted(by:) 有效但 sort(by:) 在 ForEach 循环中无效
为啥将 np.concatenate 与 for 循环和列表理解一起使用的结果不一样?