让我们假设我在pandas中有以下dataframe:
AA BB CC
date
05/03 1 2 3
06/03 4 5 6
07/03 7 8 9
08/03 5 7 1
我想把它转换成下面的形式
AA 05/03 1
AA 06/03 4
AA 07/03 7
AA 08/03 5
BB 05/03 2
BB 06/03 5
BB 07/03 8
BB 08/03 7
CC 05/03 3
CC 06/03 6
CC 07/03 9
CC 08/03 1
我该怎么做呢?
从宽到长转换的原因是,在下一阶段,我想根据日期和初始列名(AA,BB,CC)将这个 Dataframe 与另一个 Dataframe 合并。
3条答案
按热度按时间cbjzeqam1#
使用
pandas.melt
或pandas.DataFrame.melt
从宽变换为长:要转换,我们只需要重置索引,然后融化:
在
.melt
之后使用.reset_index
,无需指定value_vars
。最终结果-两个选项
2skhul332#
更新
正如乔治Liu在another answer中所展示的,
pd.melt
是解决这个问题的惯用、灵活和快速的解决方案。不要使用unstack
。unstack
返回一个具有多索引的序列:你可以在返回的序列上调用reset_index:
或者用multiindex构造一个dataframe:
hujrc8aj3#
除了
unstack
和melt
之外,这里还可以使用stack
。所有的
melt
,stack
和unstack
都是非常快的方法,所以在正常情况下,运行时的差异几乎不重要。如果运行时是这样一个问题,也可以使用基于numpy的解决方案(比melt
快50%)。这个想法是简单地将帧中的值扁平化为1D数组,并重复索引和列标签。如果列标签不需要作为单独的列,那么另一个非常快的函数是
pd.lreshape
。