#python #pandas #dataframe #dictionary
#python #pandas #фрейм данных #словарь
Вопрос:
Я пытаюсь создать словарь, в котором элементы первого столбца фрейма данных являются ключами, а остальные столбцы — значениями. В моем test_df
фрейме данных в первом столбце указаны имена изображений, а остальные содержат оценки для каждого изображения (см. Код ниже). Цель состоит в том, чтобы создать переменную, содержащую пару ключ-значение, которая сопоставляет имя изображения (ключ) с метками (значениями).
print(test_df)
1.jpg 0.21337 0.83585 0.13824 0.16486
0 101.jpg 0.087876 0.86553 0.038267 0.046497
1 106.jpg 0.231350 0.73344 0.038267 0.164860
2 107.jpg 0.406980 0.56384 0.862520 0.164860
3 109.jpg 0.257200 0.25579 0.686770 0.046497
Итак, я хочу сделать что-то вроде этого:
dict = {'1.jpg': 0.21337 0.83585 0.13824 0.16486
'101.jpg': 0.087876 0.86553 0.038267 0.046497....
'106.jpg':.......etc}
но самое близкое, что я получил, это
print(test_df.transpose().to_dict())
{0: {'1.jpg': '101.jpg', '0.21337': 0.087876, '0.83585': 0.8655299999999999, '0.13824': 0.038267, '0.16486': 0.046497000000000004}, 1: {'1.jpg': '106.jpg', '0.21337': 0.23135, '0.83585': 0.73344, '0.13824': 0.038267, '0.16486': 0.16485999999999998},...
Я также пробовал это, но не работал хорошо
dict = {k: v for k, v in zip(test_df.iloc[:,0], test_df.iloc[0,1:])}
У меня нет большого опыта работы со словарями, поэтому я был бы признателен за любую помощь.
Заранее благодарю вас
Ответ №1:
Сначала добавьте header=None
, чтобы избежать преобразования первой строки данных в имена столбцов.
test_df = pd.read_csv(file, header=None)
print (test_df)
0 1 2 3 4
0 1.jpg 0.213370 0.83585 0.138240 0.164860
1 101.jpg 0.087876 0.86553 0.038267 0.046497
2 106.jpg 0.231350 0.73344 0.038267 0.164860
3 107.jpg 0.406980 0.56384 0.862520 0.164860
4 109.jpg 0.257200 0.25579 0.686770 0.046497
Я думаю, вам нужен dictioanry списков, DataFrame.set_index
чтобы преобразовать первый столбец в индекс, а затем использовать DataFrame.agg
для списков:
d = test_df.set_index(0).agg(list, axis=1).to_dict()
print (d)
{'1.jpg': [0.21337, 0.83585, 0.13824, 0.16486],
'101.jpg': [0.087876, 0.86553, 0.038267, 0.046497],
'106.jpg': [0.23135, 0.73344, 0.038267, 0.16486],
'107.jpg': [0.40698, 0.56384, 0.86252, 0.16486],
'109.jpg': [0.2572, 0.25579, 0.68677, 0.046497]}
Или, если нужно объединить числа, используйте:
d1 = test_df.set_index(0).astype(str).agg(' '.join, axis=1).to_dict()
print (d1)
{'1.jpg': '0.21337 0.83585 0.13824 0.16486',
'101.jpg': '0.087876 0.86553 0.038267 0.046497',
'106.jpg': '0.23135 0.73344 0.038267 0.16486',
'107.jpg': '0.40698 0.56384 0.86252 0.16486',
'109.jpg': '0.2572 0.25579 0.68677 0.046497'}
Альтернативное решение:
Также возможно преобразование в индекс read_csv
по параметру index_col=0
:
test_df = pd.read_csv(file, header=None, index_col=0)
d = test_df.agg(list, axis=1).to_dict()
Комментарии:
1. @Skarl001 — Вы добавляете
header=None
вread_csv
?2. Я просто увидел это и исправил: p