Python Can';t从数据帧列表中获取索引位置

Python Can';t从数据帧列表中获取索引位置,python,pandas,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,后跟ValueError,而不是预期的0、1和2: ValueError:

我试图通过使用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,后跟ValueError,而不是预期的0、1和2:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我知道此错误通常来自数据帧比较,我尝试添加.all(),但没有效果

如果我将列表更改为字符串、int或它们的混合列表,则没有任何问题

我试着四处搜索,但没有找到关于这个特定错误的任何信息


我知道我可以很容易地添加一个额外的变量,在列表的每次迭代中不断添加1,但我真的很想知道我做错了什么。

使用
枚举

for i, df in enumerate(dfs):
    print(i)

我猜你想做这样的事情:

dfs = [df1, df2, df3]
for i, df in enumerate(dfs):
    print(i)

这不是一个与熊猫有关的问题。这只是Python的问题。

正如其他人所说,您可以使用
枚举
来做您想做的事情

至于为什么你所尝试的不起作用:

list.index(item)
查找列表的第一个元素,以便
element==item
。作为一个例子,考虑<代码> DF= DFS(0)< /代码>。当我们调用
dfs.index(df)
时,我们首先检查
df==
是否为
dfs
的第一个元素。换句话说,我们正在检查
df==df
。如果您在解释器中键入此项,您会发现这将为您提供一个
DataFrame
True
s。这是一个<代码>数据文件< /Cord>对象——但是Python想知道的是它是否应该将这个对象视为<代码> Trime< /Cord>。所以它需要将这个
数据帧
转换成一个
bool
。它试图通过
bool(df==df)
实现这一点,这依赖于
pandas
实现将任何
数据帧
转换为
bool
的方法。然而,没有这样的方法,而且理由充分——因为正确的方法是不明确的。因此,此时
pandas
引发了您看到的错误

总之:
index
要有意义,对象必须有一些相等的概念(
=
),但是
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

您尝试过enumerate()吗?ie
对于枚举中的i,df(dfs):打印(i)
这与问题无关。这只是一个Python问题。我对放置pandas标记犹豫不决,但该错误确实直接导致了数据帧问题,因此我添加了该标记。对我来说,这很像pandas问题。因为您希望获取列表中项目的索引,这是Python。老实说,我认为您没有正确阅读该问题,他们更感兴趣的是为什么
index
失败,以及为什么
pandas
抛出了
pandas
错误。好了,我现在了解了您实际要查找的信息。因为基本上您试图在列表中找到一个数据帧,该数据帧等于dfs中的df:for I,枚举(dfs)中的d:如果d==df:print(i),则会给出相同的错误消息。索引仅返回一个布尔值,例如df.column_name(“abc”),对于每个索引,如果column_name的值在数据帧df中为“abc”,则返回True,其余为False。因此,为了检索索引的值,您可以使用df.column_name(“abc”).values。我认为您将python中的内置索引方法与pandas中的.index命令混合在一起。是的,似乎是这样。