Python index () не работает - PullRequest
0 голосов
/ 15 мая 2018

У меня есть список таких фреймов данных:

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 Каков наилучший способ получить индекс массива данных в массиве?Только итерация?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Основываясь на ответе @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
0 голосов
/ 15 мая 2018

list.index работает путем проверки равенства вашего ввода с элементами из списка и поиска True.Затем он возвращает индекс первого совпадения.

Проверка равенства двух кадров данных возвращает кадр данных:

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, только если 2 переменные указывают на один и тот же объект:

lst = [df1, df2, df3]

res = next(i for i, j in enumerate(lst) if j is df2)  # 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...