DataFrame.melt(id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None) [source]
"Unpivots" DataFrame从宽格式转换为长格式,可选保留设置的标识符变量。
这个函数对于将DataFrame转换成这样一种格式非常有用,其中一个或多个列是标识符变量(id_vars),而所有其他列(被认为是测量变量(value_vars))都"unpivoted"到行轴,只留下两个非标识符列"variable"和"value"。
参数: | rame : id_vars:t 用作标识符变量的列。 value_vars: 要unpivot的列。如果未指定, 则使用未设置为 var_name:标量 用于 则使用 value_name:标量,默认为 用于 col_level: 如果列是MultiIndex,则使用此级别进行融合。 |
例子
1)仅转换 'B' 列
import pandas as pd # 创建 DataFrame df = pd.DataFrame({ 'A': {0: 'a', 1: 'b', 2: 'c'}, 'B': {0: 1, 1: 3, 2: 5}, 'C': {0: 2, 1: 4, 2: 6} }) print("原始 DataFrame:") print(df) # 仅转换 'B' 列 melted_df1 = df.melt(id_vars=['A'], value_vars=['B']) print("\n转换 'B' 列后的 DataFrame:") print(melted_df1)
2)转换 'B' 和 'C' 列
import pandas as pd # 创建 DataFrame df = pd.DataFrame({ 'A': {0: 'a', 1: 'b', 2: 'c'}, 'B': {0: 1, 1: 3, 2: 5}, 'C': {0: 2, 1: 4, 2: 6} }) # 转换 'B' 和 'C' 列 melted_df2 = df.melt(id_vars=['A'], value_vars=['B', 'C']) print("\n转换 'B' 和 'C' 列后的 DataFrame:") print(melted_df2)
3)自定义列名
import pandas as pd # 创建 DataFrame df = pd.DataFrame({ 'A': {0: 'a', 1: 'b', 2: 'c'}, 'B': {0: 1, 1: 3, 2: 5}, 'C': {0: 2, 1: 4, 2: 6} }) # 自定义列名 melted_df3 = df.melt(id_vars=['A'], value_vars=['B'], var_name='myVarname', value_name='myValname') print("\n自定义列名后的 DataFrame:") print(melted_df3)
4)指定 col_level 进行 melt
import pandas as pd # 创建 DataFrame df = pd.DataFrame({ 'A': {0: 'a', 1: 'b', 2: 'c'}, 'B': {0: 1, 1: 3, 2: 5}, 'C': {0: 2, 1: 4, 2: 6} }) # 创建具有多层索引的 DataFrame df.columns = [list('ABC'), list('DEF')] print("\n多层索引 DataFrame:") print(df) # 指定 col_level 进行 melt melted_df4 = df.melt(col_level=0, id_vars=['A'], value_vars=['B']) print("\n使用 col_level=0 转换 'B' 列后的 DataFrame:") print(melted_df4)
5)多层索引 melt
import pandas as pd # 创建 DataFrame df = pd.DataFrame({ 'A': {0: 'a', 1: 'b', 2: 'c'}, 'B': {0: 1, 1: 3, 2: 5}, 'C': {0: 2, 1: 4, 2: 6} }) # 创建具有多层索引的 DataFrame df.columns = [list('ABC'), list('DEF')] print("\n多层索引 DataFrame:") print(df) # 多层索引 melt melted_df5 = df.melt(id_vars=[('A', 'D')], value_vars=[('B', 'E')]) print("\n多层索引转换 'B' 列后的 DataFrame:") print(melted_df5)