При получении данных из DataFrame получаю массив в массиве, нужно получить один массив

Есть DataFrame со следующими данными:

DataFrame

При получении scores по индексу корректно получаю массив: result_df['scores'][0]

scores

Но если хочу получить значения scores по конкретному image_id, то получаю массив в массиве: sample_id = '9b783b776'

scores =result_df[result_df['image_id'] == sample_id]['scores'].values #scores = scores.astype(np.float32) scores

введите сюда описание изображения

Как при поиске по конкретному image_id, получить массив?


Ответы (4 шт):

Автор решения: CrazyElf

Если у вас значения в столбце image_id уникальные, то можете просто взять [0] от своего выражения, да и всё:

scores = [...] .values[0]
→ Ссылка
Автор решения: Dmitriy Nikolaev

Можно создать индекс и выбирать данные через .at

result_df.set_index('image_id').at[sample_id, 'scores']

Тут уж смотрите на размер датафрейма и производительность

→ Ссылка
Автор решения: MarianD
scores, = result_df[resu1t_df['image_id'] == sample_id]['scores'].values

(заметите запятую на левой стороне).


Объяснение:

Результатом выражения

result_df[resu1t_df['image_id'] == sample_id]

есть всегда датафрейм, хотя в вашем случае вероятно 1-строковый.

Когда вы из него выберете 1 столбец применением ['scores']:

result_df[resu1t_df['image_id'] == sample_id]['scores']

вы получите серию, хотя в вашем случае только 1-элементную.

Но и когда затем примените атрибут .values:

result_df[resu1t_df['image_id'] == sample_id]['scores'].values

вы получите поле (numpy array), хотя в вашем случае опять только 1-элементное.

Но тот 1 элемент результатного поля является тоже полем, значит, получите 1-элементное поле, из которого нужно выбрать единый элемент — внутренние поле — например так:

scores, = result_df[resu1t_df['image_id'] == sample_id]['scores'].values

(Запятая на левой стороне означает 1-элеменую кортеж.)

→ Ссылка
Автор решения: MaxU

Пример:

Воспроизводимый пример данных (DataFrame):

df = pd.DataFrame({
  "id": [1,2,3],
  "scores": [[1,2,3], [4,5,6], [7,8,9]]
})

In [16]: df
Out[16]:
   id     scores
0   1  [1, 2, 3]
1   2  [4, 5, 6]
2   3  [7, 8, 9]

Будем искать значения scores для id == 2.

Вариант 1: - используем df.loc[]:

res = df.loc[df["id"] == 2, "scores"].to_numpy()[0]

Вариант 2: - используем df.at[] и Series.idxmax():

res = df.at[(df["id"] == 2).idxmax(), "scores"]

результат:

In [19]: res
Out[19]: [4, 5, 6]
→ Ссылка