数据框无法迭代:出现以下错误:元组索引必须是整数或切片,而不是字符串

7
我已经尝试了30分钟来调试我的代码,但一直没有成功,也许你可以帮忙吗?
错误出现在第17行,但我真的不知道为什么会出错。
所以,我使用一个字典来存储我的函数is_nontrivial_reverse_number()返回的数据,它是一个布尔类型。我遍历整个字典,并插入所有从0到1100的值。
然后,我将我的字典插入到pandas库的DataFrame中。
接着,我遍历我的DataFrame以检索设置为true的值的数量。
但问题是,row["nonTrivial"]似乎不起作用,即使我在另一个字典和DataFrame集上使用了相同的函数。
import pandas as pd2

dic2 = {'nonTrivial': [is_nontrivial_reverse_number(x) for x in range(0, 1100)]}
dic2

df2 = pd2.DataFrame(dic2)
df2 = df2.set_index('nonTrivial')

#df2.head()
##df2.shape
#df.dtypes



for row in df2.iterrows():
    if (row["nonTrivial"]==True):
        n = n+1
print (n)

预期结果:n=2

实际结果:

TypeError                                 Traceback (most recent call last)
<ipython-input-314-ce7c400929e6> in <module>
     15
     16 for row in df2.iterrows():
---> 17     if (row["nonTrivial"]==True):
     18         n = n+1
     19 print (n)

TypeError: tuple indices must be integers or slices, not str

3
iterrows返回一个元组。将for row in df2.iterrows()更改为for idx, row in df2.iterrows() - ayhan
3个回答

10

为什么没有人提到在for循环中可以解包元组,例如:

for index, row in df2.iterrows():
    if (row["nonTrivial"]==True):
        n = n+1
    print (n)

那是最简单的解决方案!谢谢。 - katamayros
1
这应该是被接受的解决方案!顺便说一下,你可以只使用for _, row,因为你没有使用索引。 - Teshan Shanuka J

5

iterrow返回一个元组。如果您需要访问所需列的索引,可以使用以下方法:

for row in df2.iterrows():
    if (row[1][df.columns.get_loc('nonTrivial') == True):
        n = n+1

只是一条评论,你不需要循环行。你可以这样做:

n += (df2['nonTrivial']==True).sum()

+1 建议 OP 不要使用循环。我自己不是很擅长使用 pandas,但听说多次避免使用循环。 - hqkhan
非常感谢您的建议,我从现在开始会避免使用循环。然而,遗憾的是这并没有解决我的错误,尽管它在我的第一个字典上运行得非常好。 - Idris
非常感谢您的帮助,先生!现在我的代码运行得非常好,再次感谢您的提示,我会好好利用它的。 - Idris
@hqkhan 有时候需要使用循环,特别是当你需要在迭代之间保持状态时。避免使用循环并不总是可能的。最好先让你的代码能够工作,然后再想办法是否可以避免使用循环:#poitroae - Connor

1
尝试:

for row in df2.iterrows():
   if (row[1]["nonTrivial"]==True):
         n = n+1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接