Как извлечь значения из Pandas DataFrame, а не из серии (без ссылки на индекс)?

Вопрос: Я пытаюсь вернуть определенный элемент из 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 Я ввожу следующий код

Вопрос:

Я пытаюсь вернуть определенный элемент из 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))

Оцените статью
Добавить комментарий