Python: создание словаря из кадра данных pandas со строками в качестве ключей и столбцами в качестве значений - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть фрейм данных, который выглядит следующим образом:

     Curricula Course1 Course2 Course3 ... CourseN
0       q1      c1        c2     NaN        NaN
1       q2      c14       c21    c1         Nan
2       q3      c2        c14    NaN        Nan
...
M       qm      c7        c9     c21

Там, где количество курсов в учебных планах отличается.

Мне нужен словарь из этого фрейма данных, который выглядит следующим образом:

{'q1': 'c1', 'q1': 'c2', 'q2': 'c14', 'q2': 'c21', 'q2: 'c1' ... }

Если имена строк являются моими ключами, и для каждой строки словарь заполнен всей информацией «Учебный план»: «Курс», за исключением значений «NaN».

То, что я пробовал до сих пор, - это установить индекс для столбца 'Curricula', транспонировать фрейм данных и использовать методы to_dict ('records'), но это привело к следующему выводу:

in:

df.set_index('Curricula')
df_transposed = df.transpose()
Dic = df_transposed.to_dict('records')

out:

[{0: 'q1', 1: 'q2', 2: 'q3', ... }, {0: 'c1', 1: 'c14', 2: 'c2' ...} ... {0: NaN, 1: 'c1', 2: 'Nan']

Таким образом, здесь целочисленные значения столбцов используются в качестве ключей вместо значений разыскиваемых столбцов «Учебная программа» и, кроме того, значения NaN не исключаются.

Кто-нибудь знает, как это исправить?

С наилучшими пожеланиями, Ян

1 Ответ

0 голосов
/ 25 ноября 2018

Настройка

df = pd.DataFrame({'Curricula': {0: 'q1', 1: 'q2', 2: 'q3'},
 'Course1': {0: 'c1', 1: 'c14', 2: 'c2'},
 'Course2': {0: 'c2', 1: 'c21', 2: 'c14'},
 'Course3': {0: np.nan, 1: 'c1', 2: np.nan}})

print(df)

  Curricula Course1 Course2 Course3
0        q1      c1      c2     NaN
1        q2     c14     c21      c1
2        q3      c2     c14     NaN

Вы не можете иметь дубликаты ключей в словаре, однако вы можете использовать agg вместе с set_index и stack для создания списка для каждого уникального ключа:

df.set_index('Curricula').stack().groupby(level=0).agg(list).to_dict()

{'q1': ['c1', 'c2'], 'q2': ['c14', 'c21', 'c1'], 'q3': ['c2', 'c14']}   
...