Python:从pandas数据框中生成字典,其中行作为键,列作为值

时间:2018-11-25 16:51:56

标签: python pandas dictionary dataframe todictionary

我有一个看起来像这样的数据框:

     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')方法,但这产生以下输出:

在:

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

退出:

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

因此在这里,列整数值用作键,而不是我想要的“课程”列值,并且不排除NaN值。

有人知道如何解决该问题吗?

最好的问候, 扬

1 个答案:

答案 0 :(得分:1)

设置

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

字典中不能有重复的键,但是可以将aggset_indexstack一起使用,以为每个唯一键创建一个列表:

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

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