Создайте словарь из фрейма данных с первым столбцом в качестве ключей и оставшимися значениями

#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