我正在尝试通过使用python中的内置方法索引从数据帧列表中获取数据帧的位置。我的代码如下:
df1 = pd.DataFrame([1, 2, 3])
df2 = pd.DataFrame([4, 5, 6])
df3 = pd.DataFrame([7, 8, 9])
dfs = [df1, df2, df3]
for df in dfs:
print(dfs.index(df))
在没有得到预期的0、1和2的地方,它只返回0,后跟ValueError:
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我知道此错误通常来自数据帧比较,我尝试添加.all()但无济于事。
如果我将列表更改为类似字符串,整数或它们的混合物的列表,则没问题。
我尝试搜索,但未发现此特定错误。
我知道我可以轻松添加一个额外的变量,该变量在列表的每次迭代中继续添加1,但是我真的很想了解我在做什么错。
答案 0 :(得分:1)
使用enumerate
:
for i, df in enumerate(dfs):
print(i)
答案 1 :(得分:1)
正如其他人所说,您可以使用enumerate
来完成您想要的事情。
关于您尝试的原因为何不起作用:
list.index(item)
查找列表的第一个元素,例如element == item
。例如,考虑df = dfs[0]
。当我们调用dfs.index(df)
时,我们首先检查df ==
是否是dfs
的第一个元素。换句话说,我们正在检查是否为df == df
。如果在解释器中输入此内容,您会发现DataFrame
中有True
个。这是一个DataFrame
对象-但是Python想知道的是它是否应该将此对象视为True
。因此,它需要将此DataFrame
转换为单个bool
。它尝试通过bool(df == df)
来做到这一点,pandas
依靠DataFrame
实现一种将任何bool
转换为pandas
的方法。但是,没有这样的方法,并且有充分的理由-因为这样做的正确方法是模棱两可的。因此,此时index
会引起您看到的错误。
总而言之:为了使==
有意义,对象必须具有一些相等的概念(DataFrame
),但是DataFrame
却没有这样的概念,这是有充分理由的
如果在将来的问题中需要在DataFrame
的列表中找到def index(search_dfs, target_df):
for i, search_df in enumerate(search_dfs):
if (search_df.values == target_df.values).all():
return i
return ValueError('DataFrame not in list')
index(dfs, df[2])
Out: 2
的索引,则必须首先确定相等的概念。一个明智的想法是,如果所有值都相同。然后,您可以定义一个函数,例如:
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch.tag = indexPath.row
switch.addTarget(self, action: #selector(onSwitchValueChanged), for: .touchUpInside)
}
答案 2 :(得分:0)
我猜你想做这样的事情:
dfs = [df1, df2, df3]
for i, df in enumerate(dfs):
print(i)
这不是与熊猫相关的问题。这只是Python问题。