看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
df.melt() 是 df.pivot() 逆转操作函数。简单说就是将指定的列放到铺开放到行上名为variable
(可指定)列,值在value
(可指定)列。
具体语法结构如下:
pd.melt(frame: pandas.core.frame.DataFrame,
id_vars=None, value_vars=None,
var_name='variable', value_name='value',
col_level=None)
其中:
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
'B': {0: 1, 1: 3, 2: 5},
'C': {0: 2, 1: 4, 2: 6}})
df
'''
A B C
0 a 1 2
1 b 3 4
2 c 5 6
'''
pd.melt(df, id_vars=['A'], value_vars=['B'])
'''
A variable value
0 a B 1
1 b B 3
2 c B 5
'''
pd.melt(df, id_vars=['A'], value_vars=['B', 'C'])
'''
A variable value
0 a B 1
1 b B 3
2 c B 5
3 a C 2
4 b C 4
5 c C 6
'''
变量列和值列的名称可以自定义:
pd.melt(df, id_vars=['A'], value_vars=['B'],
var_name='myVarname', value_name='myValname')
'''
A myVarname myValname
0 a B 1
1 b B 3
2 c B 5
'''
多层索引的方法:
df.columns = [list('ABC'), list('DEF')]
df
'''
A B C
D E F
0 a 1 2
1 b 3 4
2 c 5 6
'''
pd.melt(df, col_level=0, id_vars=['A'], value_vars=['B'])
'''
A variable value
0 a B 1
1 b B 3
2 c B 5
'''
pd.melt(df, id_vars=[('A', 'D')], value_vars=[('B', 'E')])
'''
(A, D) variable_0 variable_1 value
0 a B E 1
1 b B E 3
2 c B E 5
'''
另一种转换方法是使用 pd.wide_to_long() 面板数据(panel data)便利函数。它不如 melt() 灵活,但更便于用户使用。
dft = pd.DataFrame(
{
"A1970": {0: "a", 1: "b", 2: "c"},
"A1980": {0: "d", 1: "e", 2: "f"},
"B1970": {0: 2.5, 1: 1.2, 2: 0.7},
"B1980": {0: 3.2, 1: 1.3, 2: 0.1},
"X": dict(zip(range(3), np.random.randn(3))),
}
)
dft["id"] = dft.index
dft
'''
A1970 A1980 B1970 B1980 X id
0 a d 2.5 3.2 -0.121306 0
1 b e 1.2 1.3 -0.097883 1
2 c f 0.7 0.1 0.695775 2
'''
pd.wide_to_long(dft, ["A", "B"], i="id", j="year")
'''
X A B
id year
0 1970 -0.121306 a 2.5
1 1970 -0.097883 b 1.2
2 1970 0.695775 c 0.7
0 1980 -0.121306 d 3.2
1 1980 -0.097883 e 1.3
2 1980 0.695775 f 0.1
'''
它的语法是 pandas.wide_to_long(df, stubnames, i, j, sep='', suffix='\\d+')[source]
,使用 stubnames['A','B'],此函数希望找到一组或多组格式为A-supfix1,A-supfix2,…,B-supfix1,B-supfix2,….的列,您可以使用 j(例如j='year')在结果的长格式中指定要调用此后缀的内容。假设这些宽变量的每一行都由i唯一标识(可以是单个列名或列名列表)数据框中的所有剩余变量保持不变。
详情可参考 pd.wide_to_long()。
更新时间:2024-08-11 11:26:30 标签:pandas 索引