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)