Не удается получить позицию индекса из списка Dataframes - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь получить позицию информационного кадра из списка информационных фреймов, используя встроенный метод index в 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 голосов
/ 18 сентября 2018

Полагаю, вы хотите сделать что-то вроде этого:

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

И это не вопрос, связанный с пандами. Это просто вопрос по Python.

0 голосов
/ 18 сентября 2018

Как уже говорили другие, вы можете использовать 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 sпо понятной причине не имею такого понятия.

Если в будущем вам понадобится найти индекс DataFrame в списке из DataFrame s, сначала вы должны выбратьпонятие равенства.Одно разумное такое понятие, если все значения одинаковы.Затем вы можете определить функцию как:

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
0 голосов
/ 18 сентября 2018

Использование enumerate:

for i, df in enumerate(dfs):
    print(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...