DataFrame 无法迭代:出现以下错误:元组索引必须是整数或切片,而不是 str
Posted
技术标签:
【中文标题】DataFrame 无法迭代:出现以下错误:元组索引必须是整数或切片,而不是 str【英文标题】:DataFrame can't be iterated through: getting following error: tuple indices must be integers or slices, not str 【发布时间】:2019-06-08 17:45:00 【问题描述】:过去 30 分钟我一直在尝试调试我的代码,但无济于事,也许你能帮忙?
错误出现在第 17 行,但我真的不知道为什么会这样。
所以,我使用字典来存储我的函数is_nontrivial_reverse_number()
返回的数据,这是一个boolean
类型。我遍历它并插入从0
到1100
的所有值。
然后我将我的字典插入到带有pandas
库的DataFrame
中。
然后我遍历我的 dataFrame 以检索设置为 true 的值的计数。
但问题是row["nonTrivial"]
似乎不起作用,即使我在不同的字典和数据框集上使用了相同的函数。
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
【问题讨论】:
iterrows 返回一个元组。将for row in df2.iterrows()
更改为for idx, row in df2.iterrows()
【参考方案1】:
试试:
for row in df2.iterrows():
if (row[1]["nonTrivial"]==True):
n = n+1
【讨论】:
【参考方案2】:iterrow
返回一个tuple
。如果你需要访问你想要的列的索引,你可以这样做:
for row in df2.iterrows():
if (row[1][df.columns.get_loc('nonTrivial') == True):
n = n+1
只是一个评论,你不需要循环行。你可以这样做:
n += (df2['nonTrivial']==True).sum()
【讨论】:
+1 建议 OP 不要使用循环。我自己不是熊猫用户,但多次听到以避免循环。 非常感谢您的建议,从现在开始我将避免使用循环。虽然很遗憾这并没有解决我的错误,尽管它在我的第一本词典上就像一个魅力。 非常感谢您的帮助先生!现在我的代码就像一个魅力,再次感谢您的提示,我会好好利用它 @hqkhan 有时需要循环,尤其是当您需要在迭代之间维护状态时。避免循环并不总是可能的。最好先让您的代码工作,然后确定是否可以避免循环:#poitroae【参考方案3】:为什么没有人提到他可以像这样在for循环中解包元组
for index, row in df2.iterrows():
if (row["nonTrivial"]==True):
n = n+1
print (n)
【讨论】:
这是最简单的解决方案!谢谢。以上是关于DataFrame 无法迭代:出现以下错误:元组索引必须是整数或切片,而不是 str的主要内容,如果未能解决你的问题,请参考以下文章
Python dict 将值作为 pandas DataFrame 的元组