Pandas 将字典分解为行

Asi*_*bal 7 python dataframe pandas

我有一个数据框:

    Name                                    Sub_Marks
0    Tom  {'Maths': 30, 'English': 40, 'Science': 35}
1  Harry  {'Maths': 35, 'English': 30, 'Science': 25}
2   Nick  {'Maths': 32, 'English': 23, 'Science': 20}
Run Code Online (Sandbox Code Playgroud)

我需要将字典分解为多行。例如

    Name  Subject  Marks
0    Tom    Maths     30
1    Tom  English     40
2    Tom  Science     35
3  Harry    Maths     35
4  Harry  English     30
5  Harry  Science     25
6   Nick    Maths     32
7   Nick  English     23
8   Nick  Science     20
Run Code Online (Sandbox Code Playgroud)

我知道我们可以在数据框中分解列表。有什么办法可以用字典来做吗?

Shu*_*rma 13

我们可以创建 的元组列表NameMarksSubjects通过迭代列表理解中的数据帧的值,然后我们可以从这个元组列表创建一个新的数据帧

out = pd.DataFrame([(n, k, v) for (n, d) in df.values for k, v in d.items()])
out.columns = ['Name', 'Subject', 'Marks']
Run Code Online (Sandbox Code Playgroud)

基于替代的pandas方法

m = pd.DataFrame([*df['Sub_Marks']], df.index).stack()\
      .rename_axis([None,'Subject']).reset_index(1, name='Marks')

out = df[['Name']].join(m)
Run Code Online (Sandbox Code Playgroud)
>>> out

    Name  Subject  Marks
0    Tom    Maths     30
1    Tom  English     40
2    Tom  Science     35
3  Harry    Maths     35
4  Harry  English     30
5  Harry  Science     25
6   Nick    Maths     32
7   Nick  English     23
8   Nick  Science     20
Run Code Online (Sandbox Code Playgroud)