Вопрос:
Я пытаюсь вернуть определенный элемент из Pandas DataFrame через условный выбор (и не хочу ссылаться на индекс, чтобы сделать это).
Вот пример:
У меня есть следующий фреймворк:
Code Colour Fruit 0 1 red apple 1 2 orange orange 2 3 yellow banana 3 4 green pear 4 5 blue blueberry
Я ввожу следующий код для поиска кода для черники:
df[df[‘Fruit’] == ‘blueberry’][‘Code’]
Это возвращает:
4 5 Name: Code, dtype: int64
который имеет тип:
pandas.core.series.Series
но то, что я действительно хочу вернуть, – это номер 5 типа:
numpy.int64
который я могу сделать, если я введу следующий код:
df[df[‘Fruit’] == ‘blueberry’][‘Code’][4]
т.е. ссылаясь на индекс, чтобы указать число 5, но я не хочу ссылаться на индекс!
Есть ли другой синтаксис, который я могу развернуть здесь, чтобы достичь того же?
Спасибо!…
Обновить:
Еще одна идея – это код:
df[df[‘Fruit’] == ‘blueberry’][‘Code’][df[df[‘Fruit’]==’blueberry’].index[0]]
Однако это не кажется особенно элегантным (и он ссылается на индекс). Есть ли более сжатый и точный метод, который не требует ссылки на индекс или это строго необходимо?
Благодарю!…
Лучший ответ:
Попробуйте это:
df.loc[df[‘Fruit’] == ‘blueberry’,’Code’].values[0]
Вывод:
5
Во-первых, используйте .loc для доступа к значениям в вашем фреймворке данных с помощью булевской индексации для выбора строк и метки индекса для выбора столбца. Преобразование, которое возвратило серию в массив значений, и поскольку в этом массиве есть только одно значение, вы можете использовать index ‘[0]’ получить скалярное значение из этого массива одиночных элементов.
Ответ №1
Указательный индекс является обязательным (если вы не используете next() ^), поскольку у pd.Series не гарантируется одно значение.
Вы можете использовать pd.Series.values для извлечения значений в виде массива. Это также работает, если у вас есть несколько совпадений:
res = df.loc[df[‘Fruit’] == ‘blueberry’, ‘Code’].values # array([5], dtype=int64) df2 = pd.concat([df]*5) res = df2.loc[df2[‘Fruit’] == ‘blueberry’, ‘Code’].values # array([5, 5, 5, 5, 5], dtype=int64)
Чтобы получить список из массива numpy, вы можете использовать .tolist():
res = df.loc[df[‘Fruit’] == ‘blueberry’, ‘Code’].values.tolist()
И массив, и версии списка могут индексироваться интуитивно, например res[0] для первого элемента.
^ Если вы действительно против использования индекса, вы можете использовать next() для итерации:
next(iter(res))