При получении данных из DataFrame получаю массив в массиве, нужно получить один массив
Есть DataFrame со следующими данными:
При получении scores по индексу корректно получаю массив: result_df['scores'][0]
Но если хочу получить значения 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 шт):
Если у вас значения в столбце image_id уникальные, то можете просто взять [0] от своего выражения, да и всё:
scores = [...] .values[0]
Можно создать индекс и выбирать данные через .at
result_df.set_index('image_id').at[sample_id, 'scores']
Тут уж смотрите на размер датафрейма и производительность
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-элеменую кортеж.)
Пример:
Воспроизводимый пример данных (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]


