无法从数据框列表中获取索引位置

时间:2018-09-18 09:35:15

标签: python pandas

我正在尝试通过使用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,但是我真的很想了解我在做什么错。

3 个答案:

答案 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问题。