我有一个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
我基本上只想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')])
然而,在我的实际用例中,有许多初始列(远远超过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
...
但是,如果出于某种原因确实需要生成列元组列表,则可以使用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
...
我也有同样的问题,但我的基本数据集实际上只是一个具有3级多索引的系列。我从这篇博客文章中找到了将一个系列"融化"为数据框架的答案:https://discuss.analyticsvidhya.com/t/how-to-convert-the-multi-index-series-into-a-data-frame-in-python/5119/2
基本上,你只需要在系列上使用DataFrame构造函数,它就可以完成你想要Melt做的事情。
pd.DataFrame(series)
我尝试使用pd.melt()
,但未能使其正常运行。我发现使用df.unstack()
要容易得多,它将其完全修改为长格式,然后使用df.pivot()
将其转换回所需的格式。这些链接可能会有所帮助:
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.unstack.htmlhttps://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pivot.html