【发布时间】:2021-10-27 21:19:27
【问题描述】:
在pandas 标签上,我经常看到用户询问有关在 pandas 中融化数据框的问题。我将尝试对此主题进行规范的问答(自我回答)。
我要澄清一下:
-
什么是融化?
-
如何使用融化?
-
什么时候使用melt?
我看到一些关于融化的热门问题,例如:
-
pandas convert some columns into rows : 这个其实还可以,但多解释一下会更好。
-
Pandas Melt Function : 很好的问题答案是好的,但它有点太模糊了,没有太多的解释。
-
Melting a pandas dataframe:也是一个不错的答案!但这只是针对那种特殊情况,很简单,只有
pd.melt(df) -
Pandas dataframe use columns as rows (melt):非常整洁!但问题是它只针对 OP 提出的特定问题,也需要使用
pivot_table。
因此,我将尝试对该主题进行规范的问答。
数据集:
我将在这个随机年龄的随机分数数据集上获得所有答案(更容易解释答案:D):
import pandas as pd
df = pd.DataFrame({'Name': ['Bob', 'John', 'Foo', 'Bar', 'Alex', 'Tom'],
'Math': ['A+', 'B', 'A', 'F', 'D', 'C'],
'English': ['C', 'B', 'B', 'A+', 'F', 'A'],
'Age': [13, 16, 16, 15, 15, 13]})
>>> df
Name Math English Age
0 Bob A+ C 13
1 John B B 16
2 Foo A B 16
3 Bar F A+ 15
4 Alex D F 15
5 Tom C A 13
>>>
问题:
我会遇到一些问题,它们将在下面的自我回答中得到解决。
问题一:
我如何融合一个数据框,使原来的数据框变成:
Name Age Subject Grade
0 Bob 13 English C
1 John 16 English B
2 Foo 14 English B
3 Bar 15 English A+
4 Alex 17 English F
5 Tom 12 English A
6 Bob 13 Math A+
7 John 16 Math B
8 Foo 14 Math A
9 Bar 15 Math F
10 Alex 17 Math D
11 Tom 12 Math C
我想将其转置,以便一列是每个科目,另一列是学生的重复姓名以及年龄和分数。
问题2:
这和问题1类似,但是这次我想让问题1输出Subject列只有Math,我想过滤掉English列:
Name Age Subject Grades
0 Bob 13 Math A+
1 John 16 Math B
2 Foo 16 Math A
3 Bar 15 Math F
4 Alex 15 Math D
5 Tom 13 Math C
我希望输出像上面那样。
问题3:
如果我要对熔体进行分组并按分数排序学生,我将如何做到这一点,以获得如下所示的所需输出:
value Name Subjects
0 A Foo, Tom Math, English
1 A+ Bob, Bar Math, English
2 B John, John, Foo Math, English, English
3 C Tom, Bob Math, English
4 D Alex Math
5 F Bar, Alex Math, English
我需要对它进行排序,名称用逗号分隔,Subjects 分别以相同的顺序用逗号分隔
问题 4:
我将如何unmelt 融化的数据框?假设我已经融化了这个数据框:
print(df.melt(id_vars=['Name', 'Age'], var_name='Subject', value_name='Grades'))
变成:
Name Age Subject Grades
0 Bob 13 Math A+
1 John 16 Math B
2 Foo 16 Math A
3 Bar 15 Math F
4 Alex 15 Math D
5 Tom 13 Math C
6 Bob 13 English C
7 John 16 English B
8 Foo 16 English B
9 Bar 15 English A+
10 Alex 15 English F
11 Tom 13 English A
那么我将如何将其翻译回原始数据框,如下:
Name Math English Age
0 Bob A+ C 13
1 John B B 16
2 Foo A B 16
3 Bar F A+ 15
4 Alex D F 15
5 Tom C A 13
我该怎么做呢?
问题 5:
如果我要按学生姓名分组,用逗号分隔科目和成绩,我会怎么做?
Name Subject Grades
0 Alex Math, English D, F
1 Bar Math, English F, A+
2 Bob Math, English A+, C
3 Foo Math, English A, B
4 John Math, English B, B
5 Tom Math, English C, A
我想要一个像上面这样的数据框。
问题 6:
如果我要完全融化我的数据框,所有列都是值,我该怎么做?
Column Value
0 Name Bob
1 Name John
2 Name Foo
3 Name Bar
4 Name Alex
5 Name Tom
6 Math A+
7 Math B
8 Math A
9 Math F
10 Math D
11 Math C
12 English C
13 English B
14 English B
15 English A+
16 English F
17 English A
18 Age 13
19 Age 16
20 Age 16
21 Age 15
22 Age 15
23 Age 13
我想要一个像上面这样的数据框。所有列都作为值。
请在下面查看我的自我回答:)
【问题讨论】:
标签: pandas python pandas dataframe melt pandas-melt