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