pandas.melt()
是一个非常有用的函数,用于将宽格式的数据框(wide format DataFrame)转换为长格式(long format DataFrame)。这个函数通过将多个列“熔化”为行的方式,使数据从列变成行,从而更加适合进行某些分析和可视化操作。
语法:
pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)
参数解释:
-
frame:
- 要进行熔化的
DataFrame
。
- 要进行熔化的
-
id_vars:
- 保持不变的列(标识列)。这些列不会被熔化,而是保留为最终输出的
DataFrame
中的标识变量。 - 传入字符串或字符串的列表。
- 保持不变的列(标识列)。这些列不会被熔化,而是保留为最终输出的
-
value_vars:
- 需要被“熔化”的列,也就是被转换为行的列。如果没有指定,则会自动选择除
id_vars
外的所有列。 - 传入字符串或字符串的列表。
- 需要被“熔化”的列,也就是被转换为行的列。如果没有指定,则会自动选择除
-
var_name:
- 新的“变量”列的名称(即熔化后的列名)。
- 默认值为
variable
。
-
value_name:
- 新的“值”列的名称。
- 默认值为
value
。
-
col_level:
- 如果列是多层索引(MultiIndex),指定要使用的列级别。
-
ignore_index:
- 是否忽略索引,默认为
True
。设置为False
则保留原始数据的索引。
- 是否忽略索引,默认为
使用举例:
示例 1:基础用法
假设有一个宽格式的数据框,记录了某些人的年度数据,如下:
import pandas as pd
df = pd.DataFrame({
'Name': ['Alice', 'Bob', 'Charlie'],
'Year_2019': [65, 72, 58],
'Year_2020': [70, 75, 60]
})
print(df)
输出结果:
Name Year_2019 Year_2020
0 Alice 65 70
1 Bob 72 75
2 Charlie 58 60
使用 pd.melt()
将其转换为长格式:
df_melted = pd.melt(df, id_vars=['Name'], var_name='Year', value_name='Score')
print(df_melted)
结果:
Name Year Score
0 Alice Year_2019 65
1 Bob Year_2019 72
2 Charlie Year_2019 58
3 Alice Year_2020 70
4 Bob Year_2020 75
5 Charlie Year_2020 60
解释:
id_vars=['Name']
指定Name
列保持不变,作为标识列。var_name='Year'
指定原始列名Year_2019
和Year_2020
被熔化后,存放在Year
列中。value_name='Score'
指定熔化后的值放在Score
列中。
示例 2:指定 value_vars
如果你只想熔化特定的列,可以使用 value_vars
参数来选择。
df_melted = pd.melt(df, id_vars=['Name'], value_vars=['Year_2020'], var_name='Year', value_name='Score')
print(df_melted)
输出:
Name Year Score
0 Alice Year_2020 70
1 Bob Year_2020 75
2 Charlie Year_2020 60
示例 3:多层列索引(MultiIndex)中的使用
如果 DataFrame
中有多层列索引,可以使用 col_level
参数来指定熔化某个级别的列。
import pandas as pd
df_multi = pd.DataFrame({
('Class A', 'Year_2019'): [65, 72, 58],
('Class A', 'Year_2020'): [70, 75, 60],
('Class B', 'Year_2019'): [55, 62, 48],
('Class B', 'Year_2020'): [60, 65, 50]
}, index=['Alice', 'Bob', 'Charlie'])
print(df_multi)
输出:
Class A Class B
Year_2019 Year_2020 Year_2019 Year_2020
Alice 65 70 55 60
Bob 72 75 62 65
Charlie 58 60 48 50
如果我们想要熔化其中的一个层级,可以使用 col_level
参数。
df_melted = pd.melt(df_multi, col_level=0)
print(df_melted)
输出:
Class_A Class_B value
0 Year_2019 NaN 65
1 Year_2019 NaN 72
2 Year_2019 NaN 58
3 Year_2020 NaN 70
4 Year_2020 NaN 75
5 Year_2020 NaN 60
总结
pd.melt()
是一种方便的函数,用于将宽格式数据转换为长格式,特别适用于需要将多列数据整合为两列时。它适合数据整形、可视化前的数据准备以及合并多个列的数据分析任务。