【问题标题】:Python index() doesn't workPython index() 不起作用
【发布时间】:2018-10-25 00:37:40
【问题描述】:

我有一个这样的数据框列表:

arr = [df1, df2, df3]

我想在这个列表中获得元素的位置:

position_of_df2 = arr.index(df2)

但是python在这一行给出了错误:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我做错了什么? PS在数组中获取数据帧索引的最佳方法是什么?只有迭代?

【问题讨论】:

  • 不回答您的问题,但您也许可以通过将数据框存储在以键为名称的字典中来解决您的问题,这样您就可以轻松访问它们。

标签: python pandas


【解决方案1】:

list.index 通过使用列表中的元素检查您的输入的相等性并查找True 来工作。然后它返回第一个匹配的索引。

测试 2 个数据帧的相等性返回一个数据帧:

df1 = pd.DataFrame([[1, 2]])
df2 = pd.DataFrame([[1, 2]])

print(df1 == df2)

      0     1
0  True  True

结果的真实性有歧义:

print(bool(df1 == df2))

# ValueError: The truth value of a DataFrame is ambiguous.
# Use a.empty, a.bool(), a.item(), a.any() or a.all().

选项 1

在我看来,检查您是否拥有正确数据框的最佳方法是使用有序字典并定义键(最好使用描述性名称作为键):

from collections import OrderedDict

o = OrderedDict([(1, df1), (2, df2), (3, df3)])

print(list(o.keys()).index(2))  # 1

选项 2

使用带有is 的生成器表达式,仅当两个变量指向同一个对象时才返回True

lst = [df1, df2, df3]

res = next(i for i, j in enumerate(lst) if j is df2)  # 1

【讨论】:

  • 因此,手动迭代并检查身份(使用is)。
【解决方案2】:

根据上面@jpp的回答,也引用了https://stackoverflow.com/a/19918849/423725的回答,即兴解决了。

df1 = pandas.DataFrame([1, 2])
df2 = pandas.DataFrame([3, 4])
df3 = pandas.DataFrame([5, 6])

arr = [df1, df2, df3]

def isEqual(df1, df2):
    from pandas.util.testing import assert_frame_equal

    try:
        assert_frame_equal(df1, df2)
        return True
    except:  # appeantly AssertionError doesn't catch all
        return False

def indexDF(df, arr):
    for index, dataframe in enumerate(arr):
        if isEqual(df, dataframe):
            return index

indexDF(df2, arr)
# 1

【讨论】:

  • 唯一的问题是如果df1 = df2 = pd.DataFrame([[1, 2]]),那么两个数据帧将被视为相同的索引目的。我不确定 确定这就是 OP 想要的,但应该注意。
  • @jpp 没错。具有不同 id 的相同数据帧令人困惑。问题是,我是在寻找最接近的还是与指定 df 完全匹配的。
  • 是的,这是关于数组中的第一次出现。谢谢@BcK 的回答
猜你喜欢
  • 2013-04-24
  • 2013-03-02
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2016-10-24
相关资源
最近更新 更多