我有一个看起来像这样的数据框:
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值。
有人知道如何解决该问题吗?
最好的问候, 扬
答案 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
字典中不能有重复的键,但是可以将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']}