我有一个Pandas DataFrame看起来像:
df = pd.DataFrame({'col1': {0: 'a', 1: 'b', 2: 'c'},
'col2': {0: 1, 1: 3, 2: 5},
'col3': {0: 2, 1: 4, 2: 6},
'col4': {0: 3, 1: 6, 2: 2},
'col5': {0: 7, 1: 2, 2: 3},
'col6': {0: 2, 1: 9, 2: 5},
})
df.columns = [list('AAAAAA'), list('BBCCDD'), list('EFGHIJ')]
A
B C D
E F G H I J
0 a 1 2 3 7 2
1 b 3 4 6 2 9
2 c 5 6 2 3 5
Run Code Online (Sandbox Code Playgroud)
我基本上只想要melt数据框,以便每个列级别成为一个新列.换句话说,我可以通过以下方式实现我想要的pd.melt():
pd.melt(df, value_vars=[('A', 'B', 'E'),
('A', 'B', 'F'),
('A', 'C', 'G'),
('A', 'C', 'H'),
('A', 'D', 'I'),
('A', 'D', 'J')])
Run Code Online (Sandbox Code Playgroud)
但是,在我的实际用例中,有许多初始列(超过6个),如果我可以使这个泛化,那将是很好的,所以我不必精确指定元组value_vars.有没有办法以一般化的方式做到这一点?我基本上想找到一种方法告诉pd.melt我我只想设置value_vars一个元组列表,其中每个元组中第一个元素是第一个列级别,第二个元素是第二个列级别,第三个元素是第三个列水平.
如果未指定value_vars,则id_vars默认使用所有列(未指定为):
In [10]: pd.melt(df)
Out[10]:
variable_0 variable_1 variable_2 value
0 A B E a
1 A B E b
2 A B E c
3 A B F 1
4 A B F 3
...
Run Code Online (Sandbox Code Playgroud)
但是,如果由于某种原因确实需要生成列元组列表,则可以使用df.columns.tolist():
In [57]: df.columns.tolist()
Out[57]:
[('A', 'B', 'E'),
('A', 'B', 'F'),
('A', 'C', 'G'),
('A', 'C', 'H'),
('A', 'D', 'I'),
('A', 'D', 'J')]
In [56]: pd.melt(df, value_vars=df.columns.tolist())
Out[56]:
variable_0 variable_1 variable_2 value
0 A B E a
1 A B E b
2 A B E c
3 A B F 1
4 A B F 3
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5164 次 |
| 最近记录: |